Ideas to introduce indexed objects (possibly representing tensors)

Hi there!
I'm currently writing a system of indexed n-dimensional arrays and valued tensors.

BUGS AND ISSUES:

- [ ] put more comments about the code.
- [ ] create ```TensorIndexType.from_data( )``` / ```TensorIndexType.from_symmetry( )``` methods.
- [x] missing tests for ```.applyfunc``` on ```TensExpr```.
- [x] create ```.strip( )```
- [x] test ```.strip( )```
- [ ] repeat all of Pernici's tests on valued tensors as well (or maybe not really all of them).
- [ ] mark all autodrop points with comments.
- [x] check that ```MultiArray``` never replaces ```TensorSymmetry``` in all objects' args.
- [x] `MultiArray` shall never autodrop.
- [ ] test many `NumericIndices` on the same tensor.
- [x] create tests with non-diagonal metric.
- [ ] create tests for MultiArray of rank zero.
- [ ] correct `args` in `TensMul`, and everywhere else
- [ ] remove `@XFAIL` from core tests.
- [x] `NumericContravariant` and `NumericCovariant`: only int indices
- [ ] Decide if `NumericContravariant` and `NumericCovariant` are to be subclasses of `Basic`.
- [x] `direct_sum` in `MultiArray`
- [x] create tests for `direct_sum`
- [ ] direct sum of tensors
- [ ] tensor product of tensor indices (and method on tensors as well).
- [ ] check args in TensorIndexType and TensorIndex
- [ ] check args in valued TensorIndexType
- [ ] generator MultiArray.create( … ) for rank 0 ?
- [ ] extend MultiArray to higher rank?
- [ ] Why in TensorHead isn't comm passed to Basic's constructor?
- [ ] more control for wrong data in constructors.
- [ ] test type( … *args ) in NumericContravariant
- [ ] construct new data from `self.args` and check equality and hash compatibility with original data.
- [ ] find all TODO and solve the problems
- [ ] remove all TODO
- [ ] should `MultiArray` be renamed `NDArray` or something else?
- [ ] can we inspect `numpy`'s code for their implementation of nDarrays, and import some features here?