REF/INT: never set `df._mgr` after `__init__`, never hold a Block in more than 1 BlockManager
ATM there are a few places where we will do `self._mgr = mgr.reindex_or_whatever(...)`.  I think the code would be easier to reason about if we avoided this pattern.  To do that, we will need the relevant `mgr.reindex_or_whatever` methods to be in-place at the `BlockManager` level.

Similarly I don't think we have strictly-enforced policies describing the relationship between Block objects and BlockManagers.

Potential tightening of rules we could implement:
1) A DataFrame will only ever have a single BlockManager attached to it.
2) A BlockManager will only ever be attached to a single DataFrame.
3) A Block will only ever be attached to a single BlockManager

Thoughts?  Others I'm missing?