Use opts for app start

@wookiehangover Michael forwarded my your gist of suggestions. For the start/app refactor, is the code in this PR what you had in mind?

As for the dependencies (`opts` passed into `start`), we're passing them in so we can mock them out in our tests. Should we use *rewire* or something else to mock out the dependencies at the module/require level, or do you think it's fine the way it is?