New train/valid/test cross-validation iterators and support for TrainCV extensions

This PR adds:
* The capability to perform cross-validation using training, validation, and test sets.
* Support for TrainCV extensions, including a TrainCV version of MonitorBasedSaveBest that saves the best model from each CV fold after all training is complete.

The cross-validation iterators in sklearn only return `train`/`test` splits. The new subset iterators (and their corresponding dataset iterators) in this PR return `train`/`valid`/`test` splits by starting with a standard `train`/`test` split and further dividing the `train` subset into a `train`/`valid` split.

Additionally, the cross-validation tests have been reorganized into several files.