Timestep monitor

Adding optional per-timestep monitor functions

This allows a user to monitor the solution after each timestep. Uses include:

* Outputting frequent diagnostics, e.g. synthetic probes at selected locations
* Coupling codes together, where coefficients must be updated every timestep