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).
A few more thoughts: doing this type checking in BG point does not mean that other user-defined points will behave the same. So we basically enforce strong type checking in our own point, but cannot do it in user-defined points.

This is one more reason why should go towards a concept check approach. We will then be able to check all point types passed to the algorithms for the correct definition of the coordinate system.