Go back to having to specializations and implement TensorProduct stuff

Havig different constructors for the different coordinate
types would require construction traits or something similarly
complex. Alas, it is easier to have 2 specializations. A first
implementation of the tensorproduct case is given (and tested for).
Adjust the print() method of TensorProductCoordinates

It is used on backup() and should match the syntax we
expect on restore().