REF: implement Block.reduce for DataFrame._reduce
This lets us avoid reconstructing results from a dict, makes it feasible to use the same block-skipping code for DataFrame._reduce that we use for cython_agg_blocks and apply_blockwise.