Solver callback

The goal of this PR is provide a mechanism for a client of the library (such as a GUI) to take control of the training process to decide when to start and stop training, resume, and to be notified of training stats.

A callback function is passed to the Solve method. Solver calls the callback function on each training iteration. It passes the current training statistics to the callback. The callback returns an object that tells the solver what actions it should take (make a snapshot, resume, continue training or stop and cetera) as well as learning rate and weight decay.

A default implementation of the callback is provided (DefaultSolverActions) that preserves the existing behavior of the solver. 

I think this improves a [separation-of-concerns](http://en.wikipedia.org/wiki/Separation_of_concerns) with Solver. It seems to monolithic, trying to do too much. This change factors the logic for the decisions related to stopping, learning rate, weight decay, snapshots and resuming into a dependency on the callback and moves the current logic for doing these things into DefaultSolverActions.