Copy on Write via weakrefs
Aims to eventually close #10954 , alternative to #10973 

In the interest of advancing the discussion on this, here's a skeleton of a different copy on write implementation. 

**Currently**

When setting on a view, converts to copy. 

```
 df = pd.DataFrame({'col1':[1,2], 'col2':[3,4]})
 intermediate = df.loc[1:1,]
 intermediate['col1'] = -99


intermediate

Out[8]: 
   col1  col2
1   -99     4

df

Out[9]: 
   col1  col2
0     1     3
1     2     4
```

Chained-indexing will ALWAYS fail. 

```
df = pd.DataFrame({'col1':[1,2], 'col2':[3,4]})
df.loc[1:1,]['col1'] = -99
df

Out[11]: 
   col1  col2
1     2     4
```

`SettingWithCopy` warning disabled, thought not fully removed (figure this is too early stage to really chase that down). 

Forward Protection for `loc` setting (proof of concept, added oct 2):

```
 df = pd.DataFrame({'col1':[1,2], 'col2':[3,4]})
 intermediate = df.loc[1:1,]

 df.loc[1,'col1'] = -99
 intermediate

  Out[11]: 
   col1  col2
0     1     3
1     2     4
```

**Goals / Places I'd love help**
- We've discussed keeps full-column slices as views, since we can guarantee these will always be views. I created an attribute called `_is_column_view` that can be set to `True` when a slice is a full column (e.g. `new = df['col1']`, but I'm not sure how to actually figure out if a slice is a full column, so right now it's initialized as `False` and just stays that way. 
- This has no protection against forward propagation -- situations where one sets values on a Frame and they propagate to views of that Frame. There IS a framework to address it, but it's incomplete. As it stands:
  - Frames now have a `_children` list attribute to keep references to their child `views`.
  - Before setting, there's a call to a function to try and convert the children from `views` to `copies`. 
    But as it stand, I don't know how to really manage those references (i.e. how to put references to children in that `_children` list). 

@jreback 
@shoyer 
@JanSchulz 
@TomAugspurger 
