ENH: Initial pass at implementing DataFrame.asof, GH 2941
Fixes #2941

This can almost certainly be made quicker, still digging into the
internals to understand the various underlying indexers.

There are 4 distinct logics you can apply to how to deal with the 
missings (as opposed to the Series asof, wheres theres just two, 
either skipna or dont skipna). The default is to be equivalent to 
`df.apply(lambda s: s.asof(where))`.

Likely not ready to actually be merged, but at a stage where I could
use some feedback on both the logic and implementation.
