PERF: perform reductions block-wise
Hello @jbrockmendel! Thanks for updating this PR. We checked the lines you've touched for [PEP 8](https://www.python.org/dev/peps/pep-0008) issues, and found:









There are currently no PEP 8 issues detected in this Pull Request. Cheers! :beers: 

##### Comment last updated at 2019-12-27 20:20:58 UTC Consolidated the conditions under which we go through the block-wise path.  In a follow-up, this will allow for significant cleanup of the non-blockwise path (i.e. existing _reduce code) because the set of cases it has to handle is cut down. i hypothesize that after this and #30416 we'll be able to get rid of quite a bit of the existing special case handling in DataFrame._reduce. docbuild failure looks unrelated @jreback @TomAugspurger ideally id like to get this and #29941 in before the RC. > Any user-facing changes that need a whatsnew?

None that I've identified.

> Do you think we have sufficient test coverage here?

It seems pretty solid.

> Planning to keep these asserts in?

Fine by me either way.
 ok by me (assuming you are going to back and de-gross / consolidate this code at some point). > assuming you are going to back and de-gross / consolidate this code at some point

The code added here is is pretty de-grossed.  Some of the assertions could be removed to make it less verbose, but unless we get 2D EAs (which is a windmill ive mostly stopped tilting at), this is about as good as it gets.

That said, inside DataFrame._reduce below the code introduced here is a bunch of really gross code that we _can_ clean up after this. k thanks