So I realized that whenever we load data that we don't already have cached, we call require on a new file, which does synchronous filesystem IO and blocks the event loop. This prevents anything else from happening (e.g. requests to the server) while that's going on.
We should probably add versions of the functions that load things asynchronously, and use those instead.