Add preprocessing to cross-validation

This PR adds `preprocessor` and `fit_preprocessor` arguments to `DatasetCV`, allowing preprocessing to be applied to dataset subsets generated during cross-validation. If `fit_preprocessor=True`, the preprocessor is allowed to fit to the training data subset _only_.

I've also reduced the complexity of the tests somewhat and cleaned up the interface for some of the subset iterators.