Not only is this easier to read, it's also more robust! Before, run() would call kill() and then call itself again. Which means that if kill() had a bug and started resolving its promise without setting *this.process* to `null`, then the code would enter an infinite loop!

We could have prevented that by passing an argument to run(), like *didAlreadyTryToKill*, and then checking that before trying to kill() again. Which would have prevented the infinite loop, but at the cost of making the code even uglier and harder to read.

Now, however, there is no chance of an infinite loop. Whether kill() succeeds or fails, we don't try calling it again. And if it fails with an exception, then we don't even need to do anything special to handle it, because the exception will cause the run() task to reject its promise.

We might choose to catch that exception, of course; and if kill() rejects its promise, then this yield operation would return a value, and we'd want to check it and react accordingly (`let rv = yield this.process.kill()`). But as it currently stands, we no longer risk looping, which is awesome!

Just one nit: you should be able to put this all on one line:

```
    yield this.process.kill();
```