API/DISC: engine="numba" (computational API) location in reductions functions or constructors
Currently, `engine="numba"` is enabled for `rolling` reduction functions (e.g. mean). I am making efforts to enable numba execution for `groupby` and regular `DataFrame/Series` reduction functions as well.

For `rolling`, the `engine` keyword is currently defined on the reduction functions e.g. 

```
df.rolling(2).mean(engine="numba", engine_kwargs={...})
df.groupby(key).mean(engine="numba", engine_kwargs={...})  # planned
df.mean(engine="numba", engine_kwargs={...})   # planned
```

https://github.com/pandas-dev/pandas/pull/43731#discussion_r715931881 suggested possibly putting engine in the "constructor" e.g. 

```
df.rolling(2, engine="numba", engine_kwargs={...}).mean()
df.groupby(key, engine="numba", engine_kwargs={...}).mean()
DataFrame(..., engine="numba", engine_kwargs={...}.mean()  ?
```

Pros of "in the constructor"

1. Less verbose e.g.
```
roll = df.rolling(2, engine="numba", engine_kwargs={...})
roll.mean() # numba
roll.median() # numba
roll.unsupported_agg() # raise NotImplementedError
```

Cons of "in the constructor"

1. Less flexibility in switching engines (probably minor) e.g.
```
gb = df.groupby(key, engine="numba", engine_kwargs={...})
gb.mean() # numba
# Reconstruct to switch engines
gb = df.groupby(key, engine="cython")
gb.cython_only_agg() # cython
```

2. Increased complexity with "chained constructors" e.g.
```
gb_roll = df.groupby(key, engine="numba").rolling(2, engine="numba").mean()
```

I prefer having `engine` in the reduction function, but opening this issue to solicit thoughts.