ENH: Allow users to definite their own window bound calculations in rolling
Currently `rolling` allows integer and offset as `window` arguments. This PR allows users to define a custom method for calculating window boundaries by passing a subclass of a new `BaseIndexer`

```
from pandas.api.indexers import BaseIndexer

class MyWindowIndexer(BaseIndexer):

    def get_window_bounds(self, ...):
          ....
          return (start, end)

indexer = MyWindowIndexer(arg1, arg2, ...)
result = df.rolling(indexer).mean()
```
Could help address more custom rolling window operations as described in #26959,  #13969, #25510, #24295

- [x] documented new feature
- [x] tests added / passed
- [x] passes `black pandas`
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [x] whatsnew entry
