New Features:
- Added tests to check if memory access violations can occur when `CySolver` is resolved many times.
- Added new cdef methods to `CySolver` for more efficient changes of parameters:
- `CySolver.change_y0_pointer` - Changes the y0 pointer without having to pass memoryviews.
- `CySolver.change_t_eval_pointer` - Changes the t_eval pointer without having to pass memoryviews.
- Added way for user to limit RAM usage for cython-bases solvers. This also changed how max number of steps was calculated.
Performance:
- Changing RK variables back to stack-allocated c-arrays rather than malloc arrays.
- Improved how `CySolver` and `cyrk_ode` expected size is calculated and how much it grows with each concat.
- Files now compile across multiple threads during installation.
Other Changes:
- Moved some common constants for both `CySolver` and `cyrk_ode` out of their files and into `cy.common`.
- Added more meaningful memory error messages to cython files.
- Memory allocations (or reallocations) are now performed by helper functions in CyRK.utils.
- Better future-proofed package structure (mainifests, gitignores, etc.).
- Converted most Py_ssize_t to size_t.
- Cleaned up a lot of unused variables and imports.
Bug Fixes:
- Fixed potential memory leaks in cython-based solvers when exceptions are raised.
- The new safe guards (likely the try/finally blocks) did cause a somewhat sizable hit to performance.