Completely rework the input, make a real division between solver and viewer, and set up the framework for developing additional solvers in the future