Move pretty printing out to a separate visitor
Switch AST to normalized heterogeneous tree

Node specific data but with a normalized child representation.
This makes writing external visitors easier, most of the
print visitor was cleaned up to take advantage of this new
structure.