[x] Complete the documentation for the projections
[x] Remove KernelComposition altogether.
[x] Show an example of how to manually create a product or sum kernel.
[x] Make 'calculate_kernel_matrix' static and give it points.
[x] If Grassmann is instantiated, it automatically executes: calculate_kernel_matrix, freshet_variance, karcher_mean, calculate_distance_matrix - and stores these as attributes
[x] All methods are available without instantiating Grassmann by simply passing the data points.
[x] Do not do SVD twice!
[x] All Grassmann methods should take a list of EITHER GrassmanPoint objects OR a list of numpy arrays
[x] GrassmannPoint should take also a list of arrays and indicate which, if any, of the arrays are not orthonormal in its checks
[x] Remove the shape checks in GrassmannPoint
[x] Replace ReimannianDistance with GrassmannDistance in documentation
[x] Rewrite the karcher_mean and frechet_variance to "decouple" the objective function from the optimization method
[x] Ensure that the equations for karcher_mean and freshet_variance are correct. They don't appear to be. For example, the karcher_mean specifies argmin but doesn't specify the argument.
[x] Remove all interpolation from Grassmann.
[x] Allow ManifoldInterpolation to accept a Surrogate (trained or untrained), a callable, or None in which case it performs an inbuilt linear interpolation.