Directed graphs in adjacency set representation. The implementation is based on `Data.HashMap.Strict` and `Data.HashSet` from the [unordered-containers package](https://hackage.haskell.org/package/unordered-containers). Undirected graphs are represented as symmetric, irreflexive directed graphs.