Currently, long-running C++ functions cannot be keyboard interrupted (CTRL+C) until control passes back to python. PyErr_CheckSignals() implements a low-overhead call to do this at the start of each loop iteration:
https://pybind11.readthedocs.io/en/stable/faq.html#how-can-i-properly-handle-ctrl-c-in-long-running-functions
We should add this signal handling logic to all solvers and integrators that enter loops.