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).