### Description
This is a very literal port of the dot serializing logic from Go without
any features that we don't use (displaying cycles). I'm doing this so we
can get byte matching output between Rust and Go for our integration
tests which will help during the port. Once the port is done we should
look into just using the `Dot` support that `petgraph` has.
### Testing Instructions
Build turbo with `cargo build -p turbo --features run-stub` and then run
`turbo run build --graph` on a project. Note that until scope/filter is
ported #5628 the packages included in the task graph won't match what is
expected in the integration tests.
---------
Co-authored-by: Chris Olszewski <Chris Olszewski>