ENH: implement Block splitting to avoid upcasts where possible (GH #2794)

- provides an implementation of IntBlock splitting that can avoid upcasting (to float) these blocks if a boolean condition does not affect the column, closes GH #2794)
- bugfix in internals.Block.putmask; was upcasting always on an int; and upcasting to float, (now float64)

```
In [6]: df = pd.DataFrame(1,columns=['a','b'],index=range(3))

In [7]: df.ix[1,'b'] = 0

In [8]: df
Out[8]: 
   a  b
0  1  1
1  1  0
2  1  1

In [9]: df.dtypes
Out[9]: 
a    int64
b    int64
Dtype: object

In [10]: df[df>0].dtypes
Out[10]: 
a      int64
b    float64
Dtype: object

In [11]: df[df>0]
Out[11]: 
   a   b
0  1   1
1  1 NaN
2  1   1
```