BUG: code to address #742, DataFrame.rank
#742

Hmm, I'm not sure this needs to be so complicated. Why not just have a `numeric_only` flag (default True, unless all the data are non-numeric) and call either `rank_2d_generic` on the values (if it happens to be `dtype='O'`)? If you do numeric_only=False then it will attempt to call whichever `rank_2d` method on the values matrix is appropriate (and letting failure raise an exception if there are incomparables in the DataFrame)

This solution is also more consistent with other methods that have a numeric_only flag
 About your comment - I wondered about this - but what if some object columns/rows are rank-able and others are not? Won't it then fail unnecessarily (during the 2d argsort/sort in numpy)
 In that case it _should_ fail. I'm saying the logic should probably be
- `numeric_only=None` (default)
  - attempt to rank. if fail only rank numeric data

otherwise if numeric_only=True use only the numeric data (current behavior) otherwise only use all data (and fail if there are any incomparables)
 Makes sense, will make those changes
