PERF: Rolling._apply
- [x] closes #42736
- [ ] tests added / passed
- [x] Ensure all linting tests pass, see [here](https://pandas.pydata.org/pandas-docs/dev/development/contributing.html#code-standards) for how to run them
- [ ] whatsnew entry

```
from asv_bench.benchmarks.rolling import *

self = Engine()
self.setup("DataFrame", "float", sum, "cython", "sum")
self.time_rolling_methods("DataFrame", "float", sum, "cython", "sum")

%timeit self.time_rolling_methods("DataFrame", "float", sum, "cython", "sum")
150 µs ± 889 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)  # <- PR
224 µs ± 3.18 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)  # <- master
```

cc @mroeschke 
There's an `_apply_series` which looks like a 1D case of `_apply_blockwise`; can that be refactored into `_apply_blockwise`?

`_apply_blockwise` maybe should be renamed to `_apply_columnwise` Updated timings:

```
from asv_bench.benchmarks.rolling import *

self = Engine()
self.setup("DataFrame", "float", sum, "cython", "sum")
self.time_rolling_methods("DataFrame", "float", sum, "cython", "sum")

%timeit self.time_rolling_methods("DataFrame", "float", sum, "cython", "sum")
209 µs ± 8.64 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)  # <- master
147 µs ± 3.32 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)  # <- PR, consolidate=True
133 µs ± 1.95 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)  # <- PR, consolidate=False
```

I'm OK with consolidating at that cost. > Does this deserve a whatsnew note?

either way i guess, i can add something in the next "assorted follow-ups" PR Sure that sounds good. Thanks @jbrockmendel 