Improve "Columns" accessor, 2D array interop, some refactorings

Here is a first batch of work based on the email exchange. The pull request touches quite a lot of code - but it is separated into standalone clean commits, so I think the best way to review it is to look at the individual commits (they have detailed commit messages too).

 * [performance & R interop] `df.Columns` returns virtual "boxed" vector so that `df.Columns |> Frame.ofColumns` performs no boxing and `df.Columns.["A"].As<float>()` also does not need boxing when the column contains floats.

 * [refactoring] Removed most of the reflection-based invocations on untyped vectors - this makes things slightly faster (but not significantly), but it mainly simplifies the code and removes a lot of ugliness

 * [feature] Added `Frame.toArray2D` and `Frame.ofArray2D` (and corresponding C# friendly methods)

 * [testing] Added test to cover passing of `decimal` values to R provider 

 * [assorted] Clean up (and some optimizations) for `frame.[Try]GetRow[At]` family of methods - and also added tests & comments to capture what they are supposed to do