BUG: passing DataFrame to make_block silently raises
ATM in the `except NotImplementedError:` branch of `_cython_agg_blocks`, we take a difference approach to the operation.  if that approach succeeds, we end up passing a DataFrame to `make_block` on L189, which will raise `ValueError`.  As a result, we'll end up falling back to python-space for the entire operation, which presumably entails a performance hit.

This fixes the incorrect passing of DataFrame, but the fix is kind of kludgy.  Suggestions welcome on how to improve it.
Hmm so you are saying this improves mixed block performance where some can be cythonized right?

This adds a little bit of logic so would be good to see that measured somehow to understand if it’s worth it > Hmm so you are saying this improves mixed block performance where some can be cythonized right?

I'm having a hard time cooking up an example, but roughly what I have in mind is a case with 

1) a bunch of non-EA blocks and then 
2) one EA block such that 
  a) NotImplementedError is raised at L164 (L160 in PR) and 
  b) the fallback on L179 (L180 in PR) goes through OK, so that
  c) in master, we get a ValueError when passing `result` to `block.make_block` on L180

In such a case we would end up falling back to the non-cython implementations for _all_ blocks instead of just the one relevant EA block. Closing to clear the queue.  Will revisit.