implement Delegator class
This follows #17651 in breaking #17042 into smaller pieces.  I expect one more piece after this, but will consider it a win if it ends here.

At the moment `PandasDelegate` defines `_create_delegator_property` and `_create_delegator_method` inside `_add_delegate_accessors` (but namespace-wise do not need to).  When first trying to figure out how `str`, `cat`, and `dt` worked, I found the levels of redirection confusing.  This PR

a) moves these dynamically-defined functions into staticmethods of a new `Delegator` class,

b) fleshes out the relationship between `PandasDelegate` and `AccessorProperty` in docstrings,

c) provides a new `wrap_delegate_names` class decorator as an alternative to `PandasDelegate._add_delegate_accessors` for pinning specifying the delegated properties/methods,

d) implements tests for custom accessors.

- [ ] closes #xxxx
- [ ] tests added / passed
- [ ] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [ ] whatsnew entry
