Trainer: support iterable datasets for evaluation 
The trainer seems to support passing iterable datasets as the `train_dataset`  (see #5829) but misses to support the same for the `eval_dataset`. I have implemented an iterable dataset for training and now I cannot use the same implementation for evaluation. This doesn't make much sense as evaluation could easily be done using the iterable dataset. 

Currently the evaluation fails with the following exception:
```
ValueError: DataLoader with IterableDataset: expected unspecified sampler option, but got sampler=<torch.utils.data.sampler.SequentialSampler object at 0x7f53900c50d0>
```

I suspect the below method should return None in case of an iterable dataset:

https://github.com/huggingface/transformers/blob/ef2d4cd4457a344b633173c14ca7789f18f75b59/src/transformers/trainer.py#L402-L408

Just like how it is handled for the `train_dataset`:

https://github.com/huggingface/transformers/blob/ef2d4cd4457a344b633173c14ca7789f18f75b59/src/transformers/trainer.py#L380-L400

This is more complex than this as the `Trainer` needs to knows in advance the number of elements in your evaluation dataset, so you need to implement a `__len__` method in your evaluation dataset to have `Trainer` work on it.

An iterable dataset might make sense for training since you want to yield "infinite" examples and stop at a certain step, it doesn't really makes sense for evaluation where, by definition, you have a finite number of samples.<|||||>I see, but that also means that you'd have to implement two different datasets for the same data, which is a bit annoying. Why does the trainer need to know the length of the eval dataset?<|||||>This is for the distributed evaluation to work: we need to initialize the containers for the logits and predictions to the right size and fill them with the data returned by each node.

You iterable dataset must be finite, so you can just wrap it like this before sending it to `Trainer`:
```
class FromIterableDataset:
    def __init__(self, iterable_dataset):
        self.dataset = list(iterable_dataset)

    def __getitem__(self, i):
        return self.dataset[i]

    def __len__(self):
        return len(self.dataset)
```<|||||>Yeah I guess that works for most cases. Although It might make sense to catch the case where one implements `__len__` in an iterable dataset, which might be reasonable depending on how the data is stored. Currently you're first told to implement `__len__` and then the code just fails with above exception. It would probably be better if there was a more meaningful exception regarding the use of iterable datasets for evaluation.<|||||>Anyways, this seems to be an edge case, thanks for your help!