there are a lot of functions (and there should be more, too) in run.rs. cleanup could
- move some operations into their own ops.rs file(s)
- turn parts of the
run method into sub-functions for readability
- goal: make it less mystifying what mutable state is being tracked and where it is updated