Refactor Solver to allow interactive stepping

In this PR, the main loop of `Solver::Solve` is factored out into `Solver::Step`, which is exposed to Python. This allows interactive stepping of the solver.

Warning: I've only actually tested a parallel version of this on another branch.