Speedups, bugfixes, and fleshing out current AbstractDataFrame API

@tshort The third commit is the one of interest, where I shuffled around code between DataFrame and AbstractDataFrame, and fleshed out a transient interface
My main issue is having `eachcol` and `columns` that do the same thing. I'm fine with either name, but they should be consolidated. My suggestion is to define one of these methods for AbstractDataFrames and keep the DataFrame version that uses `df.columns`.