[WIP] One-step hyperparameter grid search

The are some good examples of using YAML templates with % formatting to perform hyperparameter grid searches, but wouldn't it be nice if you could perform a grid search in one step using train.py? This PR adds the capability to use train.py to grid search with a single YAML file containing a YAML template and a hyperparameter grid (see the tests for examples).

Additional functionality includes:
* Save only `n_best` models, ranked by a monitor channel value.
* Special handling of `TrainCV` templates by `GridSearch` so you can select the best model(s) from each cross-validation fold. 
* `GridSearchCV` class, which averages scores across all cross-validation folds to get the best hyperparameters and optionally retrain the best model(s) on the full dataset using those hyperparameters.
Just a high level comment, but this file is rather big. Could there be a way to factor this into a couple files? The batch_train and gridsearch parts are relatively separated from each other.