Cache dominators to save recomputing
Add a main function to graphs.py so it can be run independently and tested
Lots of improvements. Add dominates predicate, strictly dominates predicate, function to find the immediate dominator of a node, and a function to return a new graph equal to the dominator tree of a graph.
Add dominance frontier calculation