In PR 1699 there is a promising attempt to have expressions not completely distributed, introducing
`HoldTensorHead`  which is a subclass of `TensorHead`; 
a nice feature is that one can declare the symmetry of the held expression, so that expressions
can be simplified using the symmetries, without expanding the expression;
here is the example in its docstring

```
        >>> from sympy.tensor.tensor import TensorIndexType, tensor_indices, tensorhead, HoldTensorHead
        >>> Lorentz = TensorIndexType('Lorentz', dummy_fmt='L')
        >>> a,b,c,d = tensor_indices('a,b,c,d', Lorentz)
        >>> p, q = tensorhead('p,q', [Lorentz], [[1]])
        >>> h1 = HoldTensorHead(p(a)*q(b) - p(b)*q(a), symm=[[2]], comm=0)
        >>> h2 = HoldTensorHead(p(a)*q(b) - p(b)*q(a), symm=[[1]*2], comm=0)
        >>> (h1(a,b)*h2(-a,-b)).canon_bp()
        0
        >>> t = h1(a,b)*h1(-a,-b)
        >>> t.expand(True) - 2*p(a)*p(-a)*q(b)*q(-b) + 2*p(a)*q(-a)*q(b)*p(-b)
        0
```