Rework pass manager interface

* Un-spaghettify class hierarchy
* rework API as a combination of `prepare' and run

`prepare' gathers analysis dependencies
`run' performs the transformation

to add more preparation, overload prepare
to add post-processing, overload run