Fix launch errors, improve Pods API, use hook abstraction

Sorry for the largeness of this PR, just took a while to get it all together. @mpuncel @petertseng 

This extracts the preparer's orchestration logic to a package that can be tested. It does not solve the self-hosting issue yet, but gets us most of the way there.
I don't know either. One alternative is to return a `chan struct{}` instead and start a goroutine to watch for the service coming up, with a larger number of retries, which offloads the responsibility onto the client. Not sure it gets us anything particularly useful though.