Port the DOT printer
Port the save phase.

That's the lot: everything now works in terms of positive information about instructions rather than negative information about dead edges, blocks, etc.

Remaining TODOs: stats gathering code in LoopPeelHeuristics, fix edge-is-dead not to make a long search each query (propagate invar knowledge when context is created), figure out the base object situation.

On that last, should maintain 3 pieces of information:

1. What's the base object?
2. What's the byte offset from it?

No need to maintain isIdentifiedObject since that's cheap.

Base objects are already tracked by PB; if we become uncertain about the offset then leave it to PB. The other base field tracks even non-id'd bases (non-cast, non-GEP instructions are their own base)