refactor with Nali IoC container

all functionality should be preserved, but modules (and cross-module dependencies) are using Nali DI to get their dependencies filled.

index.js registers all of the services which are used. a Nali `service` is basically just a constructor function which itself can take dependencies on other services. Nali parses these dependencies and instantiates service instances to wire everything up in the correct order.

there is some degree of documentation on nali itself, but it could always be improved (PRs welcome upstream). take a look at the code and let me know if you have questions about how it works - I want @jeremiak to be able to understand what's going on!

:confetti_ball: