PERF: Improve performance in rolling.mean(engine="numba")
- [x] tests added / passed
- [x] Ensure all linting tests pass, see [here](https://pandas.pydata.org/pandas-docs/dev/development/contributing_codebase.html#pre-commit) for how to run them
- [x] whatsnew entry

This also starts to add a shared aggregation function (mean) that can shared between rolling/groupby/DataFrame when using the numba engine.

```
df = pd.DataFrame(np.ones((10000, 1000)))
roll = df.rolling(10)
roll.mean(engine="numba", engine_kwargs={"nopython": True, "nogil": True, "parallel": True})
%timeit roll.mean(engine="numba", engine_kwargs={"nopython": True, "nogil": True, "parallel": True})

260 ms ± 13.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) <- PR
431 ms ± 9.21 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) <- master
```

how does this compare to the cython mean? > how does this compare to the cython mean?

```
In [3]: %timeit roll.mean()  # cython
371 ms ± 15 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
``` is there an issue somewhere for discussing making numba required and just using this instead of the cython versions? > is there an issue somewhere for discussing making numba required and just using this instead of the cython versions?

Not an ongoing issue, but the last time it was discussed was in https://github.com/pandas-dev/pandas/issues/28987. Looks like a lot of the discussion back then revolved around stability & maturity but those issues may not be as bad anymore. > is there an issue somewhere for discussing making numba required and just using this instead of the cython versions?

we ought to have this discussion as that would greatly simplify code generally. this is a good start though. thanks @mroeschke 