BUG: various bug fixes for DataFrame/Series construction

0 and 1 len ndarrays not inferring dtype correctly
datetimes that are single objects not inferring dtype
mixed datetimes and objects (GH #2751), casting datetimes to object
timedelta64 creation on series subtraction (of datetime64[ns])
astype on datetimes to object are now handled (as well as NaT conversions to np.nan)

astype conversion
```
In [4]: s = pd.Series([datetime.datetime(2001, 1, 2, 0, 0) for i in range(3)])

In [5]: s.dtype
Out[5]: dtype('datetime64[ns]')

In [6]: s[1] = np.nan

In [7]: s
Out[7]: 
0   2001-01-02 00:00:00
1                   NaT
2   2001-01-02 00:00:00

In [8]: s.dtype
Out[8]: dtype('datetime64[ns]')

In [9]: s = s.astype('O')

In [10]: s
Out[10]: 
0    2001-01-02 00:00:00
1                    NaN
2    2001-01-02 00:00:00

In [11]: s.dtype
Out[11]: dtype('object')
```

construction with datetimes
```
In [7]: pd.DataFrame({'A' : 1, 'B' : 'foo', 'C' : 'bar', 
    'D' : pd.Timestamp("20010101"),
    'E' : datetime.datetime(2001,1,2,0,0) }, index=np.arange(5)).get_dtype_counts()
Out[7]: 
datetime64[ns]    2
int64             1
object            2

In [16]: pd.DataFrame({'a':[1,2,4,7], 'b':[1.2, 2.3, 5.1, 6.3], 
    'c':list('abcd'), 
    'd':[datetime.datetime(2000,1,1) for i in range(4)] }).get_dtype_counts()
Out[16]: 
datetime64[ns]    1
float64           1
int64             1
object            1
```

1 len  ndarrays
```
In [16]: pd.DataFrame({'a': 1., 'b': 2, 'c': 'foo', 'float64' : np.array(1.,dtype='float64'),
    'int64' : np.array(1,dtype='int64')}, index=np.arange(10)).get_dtype_counts()
Out[16]: 
float64    2
int64      2
object     1
```