WIP: keep column levels when using apply after grouping (#16231)
 - [X] closes #16231
 - [X] 3 tests added / passed
 - [X] passes ``git diff upstream/master --name-only -- '*.py' | flake8 --diff``
 - [X] whatsnew entry

This is still experimental-- the groupby logic is awfully complicated at this point, and there are lots of edge cases.