De-duplicate dispatch code, remove unreachable branches
There are a couple of `DataFrame` methods that operate column-wise, dispatching to `Series` implementations.  This de-duplicates that code by implementing `ops.dispatch_to_series`.  Importantly, this function is going to be used a few more times as we move towards getting rid of `BlockManager.eval` and `Block.eval`, so putting it in place now makes for a more focused diff later.

Also removes a couple of no-longer-reachable cases in comparison ops.

- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`

