[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.
Can you add a comment about how UniqueParameterSampler works? I see that this class is used by RandomGridSearch, but it's not clear to me what the ParameterClass does here.