iterating or extending `Function` produces an infinite loop
We don't want to raise an IndexError since it is not inherently an iterable type, so I'm going with NotImplementedError for now. 3.15.2 released now, which contains this fix.
### Problem
Both of these examples produce an infinite loop:

```python3
import peewee

pwf = peewee.fn.count()

# example 1:
for i in pwf:
    print(f'hello {str(i)}')

# example 2:
x = []
x.extend(pwf)
```

The offending code is `ColumnBase.__getitem__`: https://github.com/coleifer/peewee/blob/master/peewee.py#L1236-L1242

I'm not sure if this only applies to `Function`, or if it affects all non-slice `ColumnBase` classes.

For context, we did run into this in a real-world use-case.

### Expected Behavior
I'm not 100% sure, but at the very least this probably should `raise` rather than infinitely loop, which is worse because it is silent and effectively a memory leak.

### Proposed Solutions
_(Disclaimer: I'm not deeply familiar with `peewee`'s internals, so this is more directional than a fully thought-out solution.)_

From the [Python docs](https://docs.python.org/3/reference/datamodel.html#object.__getitem__):
> Note [for](https://docs.python.org/3/reference/compound_stmts.html#for) loops expect that an [IndexError](https://docs.python.org/3/library/exceptions.html#IndexError) will be raised for illegal indexes to allow proper detection of the end of the sequence.

So if raising in all non-slice cases doesn't make sense, perhaps just raising an `IndexError` at the appropriate time (e.g. after 1 loop)?