PERF: cache _get_cython_function in groupby ops
Looking up the exact cython function is relatively costly, and is also something that is done repeatedly for a limited number of possible cases, so a good target for caching. 

Using the `GroupManyLabels` benchmark we have:

https://github.com/pandas-dev/pandas/blob/b835ca2fc2f772c27c914ae532cd32f8db69724a/asv_bench/benchmarks/groupby.py#L133-L145

```python
ncols = 1000
N = 1000
data = np.random.randn(N, ncols)
labels = np.random.randint(0, 100, size=N)
df = pd.DataFrame(data)
df_am = df._as_manager('array')
```

I get

```
In [2]: %timeit df_am.groupby(labels).sum()
72.6 ms ± 1.24 ms per loop (mean ± std. dev. of 7 runs, 10 loops each) <-- master
66.4 ms ± 1.43 ms per loop (mean ± std. dev. of 7 runs, 10 loops each) <-- PR
```

(the difference is not huge, but I am going to do several PRs with small changes that give a few ms improvement. And with all those together I hope to get the total time down to around 20ms, and in that case 5ms is significant)

