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())
Well, indeed they're probably not necessary.
Actually, the whole functions codepaths were quite convoluted and crufty, and i wanted to refactor most of it, but i was reluctant to touch the existing code more than strictly necessary; for example breaking the (unspecified) order of fields in output. However i just noticed that there were inconsitencies about it anyway, so i'll propose the refactoring (see commit, and comment below). Sorry for making you review twice.