Change 'frame (op) series' behaviour to use outer join (#208)

The previous behaviour was using inner join, which means that applying numerical operation
to a frame and series could return a frame with fewer column keys than the original frame
(although this did not happen when there were non-numerical columns in the frame).

This changes the behaviour to use outer join and so the returned frame will contain the
union of the keys from the frame and the series. (As an alternative, we could preserve the
keys of the frame and do left/right join, but this seems counter-intuitive when you have
a series on the left e.g. "s + f" would be a frame with the keys of "f").

I also did some performance improvements (perform the join just once, which makes it
about 2x faster) and refactorings (the `unboxVector` check is now done in `tryCast`
and `tryChangeType` functions, so you do not have to worry about this when writing
code that changes types of vectors).
Make it easier to specify index column & drop it when indexing

After a discussion with @hmansell and @perryvais, they finally convinced
me that `indexRows` family of operations should remove the column that
was used as the key, so this implements this (breaking) change. Using
method-based syntax, you can still call `df.IndexRows("Key", keepColumn=true)`
if you want to keep the column, but F# functions always drop the column.

Aside from that, I also added optional parameter to `ReadCsv` and to
`ofRecords`, so you can now specify index column when creating frames:

    Frame.ofRecords<DateTime>(seq, indexCol="Date")
	Frame.ReadCsv<DateTime>("file.csv", indexCol="Date")
Fix remaining tests for indexing change