ENH: Support nested renaming / selection
This adds special support for controlling the output column names when performing column-specific groupby aggregations. We use kwargs, using the keywords as the output names, and expecting tuples of `(selection, aggfunc)`.

```python
In [2]: df = pd.DataFrame({'kind': ['cat', 'dog', 'cat', 'dog'],
   ...:                    'height': [9.1, 6.0, 9.5, 34.0],
   ...:                    'weight': [7.9, 7.5, 9.9, 198.0]})
   ...:

In [3]: df
Out[3]:
  kind  height  weight
0  cat     9.1     7.9
1  dog     6.0     7.5
2  cat     9.5     9.9
3  dog    34.0   198.0

In [4]: df.groupby('kind').agg(min_height=('height', 'min'), max_weight=('weight', 'max'))
Out[4]:
      min_height  max_weight
kind
cat          9.1         9.9
dog          6.0       198.0
```

Closes #18366 

---

Putting this up as a WIP before the meeting on Thursday.

TODO:

- [ ] Update old deprecation message to point to new way
- [ ] Decide if we want to allow this elsewhere (DataFrame.agg? SeriesGroupBy.agg?)

cc @jorisvandenbossche @WillAyd 