Refactor Frame API to use Cols/Rows.

This adds the new Rows/Cols abstraction for working with col/row extractors. Many methods on Frame change to use these instead, so it is very much a big breaking change.
It looks like if you do a `fromGeneric`, the resulting `columnsAsSeries` results in columns with a bunch of `NA`s even when the source generic data didn't have any. That doesn't seem right to me.

```
scala> :paste
// Entering paste mode (ctrl-D to finish)

val f0 = Frame.fromGeneric(
    "a" :: 1 :: HNil,
    "b" :: 2 :: HNil,
    "c" :: 3 :: HNil)

// Exiting paste mode, now interpreting.

f0: framian.Frame[Int,Int] =
    0 . 1
0 : a | 1
1 : b | 2
2 : c | 3

scala> println(f0.columnsAsSeries)
Series(0 -> TypedColumn(Column(Value(a), Value(b), Value(c), NA, NA, ...)), 1 -> TypedColumn(Column(Value(1), Value(2), Value(3), NA, NA, ...)))

scala>
```