Do not consume unnecessary memory during sharding
When sharding `IterableDataset`s, a temporary list is created that is then indexed. There is no need to create a temporary list of a potentially very large step/world size, with standard `islice` functionality, so we avoid it.

```shell
pytest tests/test_distributed.py -k iterable
```
Runs successfully.