The nuts and bolts Runge-Kutta solver
Users won’t use this directly if they aren’t defining their own Runge-Kutta solver
Used as a common struct for the specific implementations
The solver for any Runge-Kutta method
Users should not use this type directly, and should
instead get it from a specific RungeKutta struct
(wrapped in an IVPIterator)
This trait defines a Runge-Kutta solver
The RungeKutta struct takes an implementation of this trait
as a type argument since the algorithm is the same for
all the methods, just the order and these functions
need to be different.