WIP: support Table mixin columns

This is essentially the same as #1833, #1835, #1839 but will be done in the framework of #2790 as a follow-on once that is merged.

The starting point here will be fed00dc5f6d6d9529ed8f073c95346eb176fdfa6, which *removed* the proof-of-concept changes showing that mixin columns would be straightforward in the new column-based Table structure.   In this issue (and eventual PR) we can define the right way to support mixin columns like Quantity, Time, and SkyCoord.  The original proof-of-concept used a some simple class / instance variables, but @mhvk has proposed using an abstract base class.

Closes #1833
Closes #1835
Closes #1839
`Table.MaskedColumn` avoids the annoying behavior below by always expanding the mask:
```
In [1]: a = np.ma.array([1,2,3])
In [2]: a.mask
Out[2]: False
In [3]: a.mask[1] = True
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-ed41d7a20f4a> in <module>()
----> 1 a.mask[1] = True

TypeError: 'numpy.bool_' object does not support item assignment
```
I don't think it's a high priority to avoid expanding the mask for mixins.  That could be a future optimization, but since they are byte arrays the memory footprint is typically small compared to the data (esp. for Time and SkyCoord that use at least 16 bytes per row).