REF: Groupby.pad/backfill operate blockwise
We get a decent-but-not-whopping perf boost, with a much bigger perf boost in the follow-up that de-duplicates an argsort call that we're currently doing repeatedly inside the cython function.

More importantly, we're getting close to having everything operate blockwise, at which point we can get rid of _get_cythonized_result and send everything through the _cython_operation path.

```
import pandas as pd
import numpy as np

np.random.seed(23446365)
arr = np.random.randn(10**5, 10)
mask = arr < -1
arr[mask] = np.nan

df = pd.DataFrame(arr)

gb = df.groupby(df.index % 7)

%timeit res = gb.pad()
28.7 ms ± 113 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)  # <- master
24 ms ± 1.06 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)  # <- PR
```
lgtm rebased + green