Revisit how type conversions are implemented

This change was triggered by my surprise that `fillMissingWith 0.0` did not work on frame I loaded from a CSV file (because the values were loaded as `decimal` and 0.0 is `float` - and so they are of different types).

The checkin implements nicer conversion function that has three modes (exact, safe and flexible), replacing castType (exact) and changeType (flexible). Safe can be used to allow safe widening in numerical conversions (e.g. converting int/float32/decimal to float or byte to int/decimal/float). The checkin uses the new safe mode in a few places, but it lets us be more careful about how hidden conversions are done in the future.
Fix filling missing values (#222)

Use low-level vector operations rather than mappin over columns
(this also makes the operation about 10x faster!)