BUG: Preserve Series/DataFrame subclasses through groupby operations
This pull request fixes a bug that caused subclassed Series/DataFrames to revert to `pd.Series` and `pd.DataFrame` after `groupby()` operations. This is a follow-up on a previously abandoned pull request (#28573)

- [x] closes #28330
- [x] tests added / passed
- [x] passes black pandas
- [x] passes git diff upstream/master -u -- "*.py" | flake8 --diff
- [x] whatsnew entry
I updated my branch with additional tests, and a revised entry in the whatsnew rst file. 

Please let me know if there are any additional recommendations for how to proceed with this PR. Just to follow-up -- I have a few questions / comments on how best to proceed:

1. The change I made to appease mypy seems to pass all tests, but please let me know if you have a better way to handle that line.
2. Although I initially agreed with having `GroupBy.ngroup()` and `GroupBy.cumcount()` return `Series`, I think it makes sense to have them preserve subclasses (as I initially had it). This would make it so that all `groupby.agg()` / `groupby.transform()` operations return the calling subclass, rather than having two operations that return a different type. 

Thanks for your help,
Jack Thanks for the mypy advice -- I managed to refactor that section a bit to only call `cast()` if needed and avoid calling the constructor again. 

The one additional change made here is to make sure `GroupBy.size()`, `GroupBy.ngroup()`, and `GroupBy.cumcount()` preserve subclassed types. While you had previously mentioned just keeping these return types as `Series`, I think these changes minimize the possibility for surprise when subclassing `DataFrame`/`Series` by ensuring that groupby reductions/transformations preserve the subclasses. @jreback -- please let me know if there are any additional changes to this PR that you think are necessary.  @jreback I made the recommend changes:
- I reverted the changes in `DataFrameGroupBy._cython_agg_blocks()` because they did not prove necessary to pass my tests.
- I added a `GroupBy._constructor` property to simplify the calls in `ngroup`, `cumcount`, and `size`. @simonjayhawkins Thanks for the comment -- I agree that line should have used `self.obj._constructor`, and changed it  As per the discussion above, the GroupBy property has been renamed to `_obj_1d_constructor` to clarify its expected return type, and I refactored it to avoid using an `else` statement.  thanks @JBGreisman very nice, thanks for sticking with it and being responsive! no worries -- thanks for the help/suggestions!