Solver callback

Add a callback to the Solve method. The callback is called on each iteration from Solver passing the training stats. Callback returns an actions object that tells the solver whether it should continue, learning rate, weight decay and so on. It allows a client of the library to take control by providing an implementation of the callback function, such as is required to have a GUI app that calls Solve and controls the training such as when to stop, learning rate and so on.