New FiniteDatasetIterator interface

This pull request deprecates the old interface using `Dataset.get_data` and replaces it with a new interface using `Dataset.get`. This allows for more flexibility, as some datasets may have a memory-efficient representation for the data when an explicit dense design matrix is too expensive.

In the new interface, `FiniteDatasetIterator` calls the dataset's `get` method by passing a tuple of sources and a list or slice of indexes, and the dataset returns a tuple of batches of examples.