GraphViz output of the type-dependency graph.

Implemented an ordering over TypeAtoms and rewrote the operators in
PartialDataType and DataType to use it. This allows correct storage
in std::sets.

The state of the dependency graph is output in GraphViz triples,
using record positions as edge labels, or -1 for pointers. The set
of types is projected onto an expansion included the target types
for pointers.

Computing the canonical version of the SymbolTable will be equivalent
to folding this graph merging isomorphic nodes in cycles - we do not
care about isomorphic nodes in distinct cycles as they lie in
non-isomorphic sub-graphs (i.e. the records refer to distinct primitive
types).

The simplest way to handle this stateful rewrite is to insert a
const DataType * into each node (PartialDataType) and process nodes
according to a reverse topological sort until it blocks on a cycle.