Tensor substitute bug

This is a refactoring of all data handling inside the tensor module. Numpy-data are now evaluated lazily, only when accessed data are computed. This will help keeping the code clear, separating the abstract tensor operations from the numpy tensor operations.

TODO list:

* [x] should it be possible to assign data to `TensMul`
* [x] should it be possible to assign data to `TensAdd`
* [x] check that no autodrop points exist anymore
* [x] data deletion once the referring tensor is deleted?
* [x] assign a numpy ndarray to a tensor (e.g. `A.data = ndarray_instance`), check parsing and write a test.
* [x] docstring notice about how data will be treated after the tensor destruction.
* [x] add a cache and a garbage collector? Do it now or in a future PR?
* [x] finish docstrings.
* [x] calling `TensMul.__call__( )` on a `TensMul` with already contracted indices, what happens if you pass non-contracted indices into its arguments?
* [x] bug in non-diagonal metric: get the inverse metric.
* [x] Unnecessary __del__ methods.
* [x] Removal of public API like VTIDS and some method, without deprecation.