Our Graph type consists of only a map of Nodes,
indexed by strings. The graph's edge data is stored
in the Nodes themselves, which makes cycle detection
a bit easier.
TopSort creates a topological sort of the Nodes of a Graph.
If there is a cycle, an error is returned, otherwise the
topological sort is returned as a list of node names.