Fix/strong type checking for cs template parameter

Implement a strict type checking mechanism for the template parameter of the non-Cartesian coordinate systems. The goal is to allow the instantiation of `bg::cs::spherical<T>`, `bg::cs::geographic<T>`, etc., only when `T` is either `bg::degree` or `bg::radian`.

Note that, even with the stronger type checking mechanism mentioned above, since the coordinate system is never really created when a `bg::model::point<>` is created, it is possible to write something like:
```
bg::model::point<double, 2, bg::cs::geographic<double> > p;
```
By making `bg::model::point<>` derive privately from the coordinate system, the above syntax is no longer accepted (see second commit).
Exactly, just like it was done in the Point Concept.

    typedef typename coordinate_system<Geometry>::type csystem;

and in `model::point<>`:

    typedef CoordinateSystem csystem;

Isn't that enough? In case if it wasn't, must a member of CS be accessed (`unit`)? Couldn't CS be passed to some already existing template as parameter? E.g. something like:

    typedef typename boost::mpl::identity
        <
            typename coordinate_system<Geometry>::type
        >::type csystem;

or

    typedef typename boost::mpl::identity<CoordinateSystem>::type csystem;

Then this file wouldn't be required.