For matrices, this uses matrix_tensor_product to compute the Kronecker
or tensor product matrix. For other objects a symbolic TensorProduct
instance is returned. The tensor product is a non-commutative
multiplication that is used primarily with operators and states in quantum
mechanics.

Currently, the tensor product distinguishes between commutative and non-
commutative arguments. Commutative arguments are assumed to be scalars and
are pulled out in front of the TensorProduct. Non-commutative arguments
remain in the resulting TensorProduct.

In general this will try to pull expressions inside of TensorProducts.
It currently only works for relatively simple cases where the products have
only scalars, raw TensorProducts, not Add, Pow, Commutators
of TensorProducts. It is best to see what it does by showing examples.