Add OptimizationStrategy and MethodBackedGraph

MethodBackedGraph contains all of the mess needed to
manipulate graphs + implementations. And having a simple
interface for optimizers cleans things up. Testing
is also easier.