REF: make _aggregate_series_pure_python extraction behave like the cython version
After some investigation it turns out that the DTA casting in `_try_cast` is made necessary because we incorrectly pass datetime64tz to `_aggregate_series_fast`, which calls the cython `libreduction.SeriesGrouper`, which casts the input to `ndarray`, losing the timezone.  By not going through the cython path for datetime64tz, we avoid the need to re-cast.

That in turn surfaces a new problem, which is that _aggregate_series_pure_python checks the first group's result slightly differently than the cython version does (see libreduction._extract_result).  This changes the way the pure-python version does it to more closely match the cython version. I intend to make these match more precisely in an upcoming pass.

If merged, makes #29589 unnecessary.

cc @jreback @jorisvandenbossche @WillAyd 