Object-orientify solvers.

Create a new abstract class "Solver" from which solver
implementations can inherit. The primary benefit is that
the developer need only provide the Solver.step() function.

To accompany Solver is a "Hamiltonian" object. The
Hamiltonian and Solver objects are related via the strategy
design pattern.