BUG: DataFrame.where does not respect axis parameter when shape is symmetric
Fixes GH #9736.

The problem was that at the `Block` level, `where` and `putmask` did a lot of guessing about how the block and the other parameters needed to be transposed in order to align correctly. It guessed wrongly when the DataFrame was symmetric because the shapes match up in both directions. This change tries to make everything explicit and remove the guessing.

Fixed handling of multiple dtypes / blocks (and added some tests), and rebased
 @evanpw you mentioned an issue above. pls carify.
 The original behavior was to align `cond` and `other` with each Block along the 'columns' axis only when no axis parameter was passed to `where` (which can only happen in the case that `other` is also a `DataFrame`), but that doesn't work in some cases. The correct behavior seems to be: always align `cond` (because each Block only contains a subset of the columns), and align `other` whenever it has the same `ndim` as `self`, or if the alignment axis is 'columns': basically, every case except `DataFrame.where(cond, Series, axis='index')`

This is all fixed in the most recent commit.
 @evanpw pls rebase for 0.17.0
 @evanpw can you update when you have a chance. you mentioned some issues above.
 The original commit had some problems if the DataFrame had multiple blocks, but that has all been fixed. See my previous comment.
 can you rebase (after updating where the release not goes). just want to take a quick look again.
 rebased
 merged via https://github.com/pydata/pandas/commit/931e0e5596e5714ecab5665d10735c155a2313f7

thanks!
