New solver interface, part #1

This merge implements a new way of how problems and solvers work in OpenTidalFarm. Before we had one global config object that contained the settings for all parts of OpenTidalFarm. 

In this new implementation, there exist multiple core objects, such as a Domain, SWProblem, and a SWSolver. Each of them are largely independent and contain their own parameters.