ENH: more flexible describe() + tests

this patch adds a return_type keyword argument to describe() to make it more
flexible to use on mixed-type dataframe. User can now select among returning
numeric, categorical, or both, as well as 'auto' (previous behaviour, default),
and 'same', which keep columns identical (useful, e.g. with groupby())
Why are you not doing this instead for all this loolping (starting at 3687)

```
In [7]:    df = DataFrame({'catA': ['foo', 'foo', 'bar'] * 8,
                        'catB': ['a', 'b', 'c', 'd'] * 6,
                        'numC': np.arange(24),
                        'numD': np.arange(24.) + .5,
                        'ts': tm.makeTimeSeries()[:24].index})

In [8]: df.apply(lambda x: x.describe())
Out[8]: 
       catA catB       numC       numD                   ts
25%     NaN  NaN   5.750000   6.250000                  NaN
50%     NaN  NaN  11.500000  12.000000                  NaN
75%     NaN  NaN  17.250000  17.750000                  NaN
count    24   24  24.000000  24.000000                   24
first   NaN  NaN        NaN        NaN  2000-01-03 00:00:00
freq     16    6        NaN        NaN                    1
last    NaN  NaN        NaN        NaN  2000-02-03 00:00:00
max     NaN  NaN  23.000000  23.500000                  NaN
mean    NaN  NaN  11.500000  12.000000                  NaN
min     NaN  NaN   0.000000   0.500000                  NaN
std     NaN  NaN   7.071068   7.071068                  NaN
top     foo    d        NaN        NaN  2000-01-31 00:00:00
unique    2    4        NaN        NaN                   24
```