BUG: Various inconsistencies in DataFrame __getitem__ and __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.