Add pre-scale for non-commutative scalars.
Improved default implementations
Tidy code and distinguish mandatory / optional protocols
Docs