feat: port package graph (#5345)
### Description
Adds a rust port of the package graph contained in `context.go`
This PR is primarily concerned with the building of the package graph,
more getter methods and graph traversal logic will need to be added for
for prune/run.
Reviewer notes:
- The package graph is configured by the `PackageGraphBuilder` object.
The goal of this object is to allow for the creation of package graph
without touching the file system
- The builder gets converted to a `BuildState<T>` where `T` goes through
`ResolvedPackageManager`, `ResolvedWorkspaces`, and `ResolvedLockfile`.
The goal of these separate types is to avoid using methods out of order.
- As of writing this doesn't yet hook up lockfile parsing to the package
graph construction
### Testing Instructions
Added testing for the primary parts of the graph construction where
things can go wrong:
- duplicate workspace names
- connecting internal dependencies
- traversing the lockfile
There can be more tests written around lockfile construction as we
already have surpassed the amount of unit tests on the Go side.
---------
Co-authored-by: Chris Olszewski <Chris Olszewski>
Co-authored-by: --global <Nicholas Yang>