New cross-validation iterators that return train/valid/test splits

This PR adds the capability to perform cross-validation using training, validation, and test sets.

The cross-validation iterators in sklearn only return `train`/`test` splits. The new subset 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.