Refactoring wait-and-reload! to expose some of its components.

`wait-and-reload!` blocks the current thread and waits for changes. This
is useful, but makes it hard to kill the process without killing the
whole session.

By exposing the pieces, we get better-factored code and
open up the possibility of polling for changes in different ways, that
are easier to pause/kill. For example, a core.async go-loop.