Run cmds asynchronously: start, wait, stop, kill

This adds an API for running cmds and explicitly waiting for them
to exit.

This updates the original `run` implementation to just be a macro
to `start` then `wait`.

Closes #9.