OK so I went ahead and did this on my fork:
Saving stores and environments to disk naively (by converting to s-expression) causes huge blowup and runs me out of memory. I assume this is because the environments that functions close over are shared in memory, but get copied when serialized; we need serializable structs, which maybe we can get or define, but that's another issue.
As an experiment, I tried in-memory caching of the starting store and environment for tests. By paying an up-front cost of a couple seconds, we seem to be able to save about 3 seconds per test. That's about 9 minutes total off the running time of the tests; not the huge speedup I was hoping for, but at least something.
It works by having the interpreter throw a special Snapshot exception when it sees a snapshot special form. This exception is caught by run-python/snapshot in python-tools, which stores it in a global. run-python checks for this variable and, if its present, doesn't do any library wrapping and calls interp-env directly with the snapshot's environment and store.
Any thoughts or comments?