Adagrad Refactoring

This PR does a few things:
1.  Creates SGDLinearClassifier, an abstract class underneath UpdateableLinearModel holding all of the sgd models with learning rates.
2.  Creates a hierarchy of LearningRateComputation classes; now in BinaryModelTrainer, you specify what kind of learning rate schedule you want ("adagrad","exponential", etc..) and the correct LearningRateComputation class is built and handed to the model constructor.
3.  Truncation, regularization, and the model weights all used to share the same LearningRateComputation. This PR separates them, which is necessary if you'd like your model learning rate to be adagrad and your regularization learning rate to decay exponentially.
put some comment here about how this seems to stop oscillation but the initializzation goes kind of un-mentioned in the literature