1. Add CartesianProductEJA. 2. Add references and start citing them. 3. Implement the octonion simple EJA. 4. Override random_instance(), one(), et cetera in DirectSumEJA. 5. Switch to QQ in *all* algebras for _charpoly_coefficients(). This only works when we know that the basis can be rationalized... which is the case at least for the concrete EJAs we provide, but not in general. 6. Pass already_echelonized (default: False) and echelon_basis (default: None) into the subalgebra constructor. The value of already_echelonized can be passed to V.span_of_basis() to save some time, and usinf e.g. FreeModule_submodule_with_basis_field we may somehow be able to pass the echelon basis straight in to save time. This may require supporting "basis" as a list of basis vectors (as opposed to superalgebra elements) in the subalgebra constructor. 7. Use charpoly for inverse stuff if it's cached. 8. The inner product should be an *argument* to the main EJA constructor. Afterwards, the basis normalization step should be optional (and enabled by default) for ALL algebras, since any algebra can have a nonstandard inner-product and its basis can be normalized with respect to that inner- product. For example, the HadamardEJA could be equipped with an inner- product that is twice the usual one. Then for the basis to be orthonormal, we would need to divide e.g. (1,0,0) by <(1,0,0),(1,0,0)> = 2 to normalize it.