BUG: Various inconsistencies in DataFrame getitem/setitem behavior (fixes #2765)
see #2765 

Note, to address " ___getitem___ does not reindex boolean Series key but ___setitem___ does ", I have changed the ___getitem___ behavior rather than the ___setitem___ behavior because it is more consistent with other indexing behavior and does not break any tests...just in case, I have inserted a warning about this happening (which only triggers when a reindex is actually required)

Also, in addition to resolving the bugs, I have refactored the code to make ___getitem___ and ___setitem___ code paths as symmetric as possible, in order to help prevent more issues in the future.

Last time I tumbled down the spaghetti stack of `__getitem__` I encountered a helpful 
"here be performance dragons" warning comment left somewhere by wesm for the potential 
yet-to-be scarred contributor.

So, just a hunch, but did you check for perf regressions for this vs. master? 
(using `test_perf.sh` is probably most convenient).
 ok, will take a look
 ok, only one test consistently affected: after a tweak, things are good now (test_perf.sh gives ratios that look basically normally distributed around 1.0, with no single test consistently doing worse across multiple runs)
 ok, good.

If you're changing behaviour of `__getitem__` and `__setitem__`, it's a good idea
to reify the desired behaviour with some new tests, since there's obviously 
no coverage there right now and It'll make it easier to review as well.
 yeah, already added test coverage
 Sorry, I missed that when looking.
 found a leftover print statement in my test code...decided to consolidated the merges and made a new PR at #2776 rather than spamming the commit log
 Github allows you to do a forced push to the PR branch, in which case, the current state of the branch
replaces the original PR commits. No need for a new PR (next time).
 Ahh, wasn't sure if Github handled non-ff pushes to PR branches well. What does the PR show on the website when you do that? I guess I'll find out next time.
 It throws away the old commits and shows just the new state of the branch.
 ok, good to know
