Dynamic coordinate preferred representation

This is a way to allow dynamic preferred representation for coordinates (low-level and high-level).  This is a possible way forward for the concerns raised in #2550.

DO NOT MERGE now.

Example:
```
>>> import astropy.units as u
>>> from astropy.coordinates import *
>>> c = ICRS(1*u.deg, 2*u.deg)
>>> c.ra
<Longitude 1.0 deg>
>>> c.preferred_representation = CartesianRepresentation
>>> c
<ICRS Coordinate: x=0.999238614955 , y=0.0174417749028 , z=0.0348994967025 >
>>> c.x
<Quantity 0.9992386149554826>
>>> c.ra  # I don't quite understand why the ra property goes to __getattr__ in this case
ERROR: AttributeError: 'ICRS' object has no attribute 'ra' [astropy.coordinates.baseframe]
Traceback (most recent call last):
  File "<ipython-input-8-37edf1c420ac>", line 1, in <module>
    c.ra
  File "astropy/coordinates/baseframe.py", line 546, in __getattr__
    .format(self.__class__.__name__, attr))
AttributeError: 'ICRS' object has no attribute 'ra'

>>> c.data  # Still Spherical underneath the hood
<UnitSphericalRepresentation lon=1.0 deg, lat=2.0 deg>

>>> sc = SkyCoord(1*u.deg, 2*u.deg)
>>> sc.frame.preferred_representation = CartesianRepresentation
>>> sc
<SkyCoord (NoFrame): x=0.999238614955 , y=0.0174417749028 , z=0.0348994967025 >
>>> sc.x
<Quantity 0.9992386149554826>
```