- Added free functions for performing free-tensor, shuffle, half-shuffle
multiplication between pairs of tensors (of either kind).
- Added free function for applying the adjoint of left free tensor
multiplication to arbitrary tensors.
- Improved exception usage, messages now include filename, lineno, and
function name to help locate c++ exceptions passed through to Python.
- Basis objects in Python are now iterable.
- Added `split_n` and `to_index` methods to Tensor key.