Reorganize responsibilities and add in-memory code swapping for hot reloading

This is a huge refactor of the code's organizational structure and the
way an app is instantiated and managed.  Instead of creating a single app
that can only be re-created by tearing down and reloading the whole JVM
and associated stack we can use some of clojure's built-in namespace tools
to reload our own code interactively.  This makes it a lot easier to quickly
test changes and also encourages experimentation within the REPL as a standard
part of the development workflow.

Note that this is pretty rough and will be cleaned up more in future commits.
Eventually this should live as a leiningen template for reloadable apps.