fix(runner): exit with proper code when tests fail

When errors with messages matching /timeout/ were created, Protractor
clears the control flow so that the remainder of the tasks scheduled
for that spec don't bleed over into the next spec. This was messing up
the promises used in the runner, since they are also webdriver promises.
Long term, the runner should _not_ use webdriver promises. For now, fix by
having the runner resolve promises directly rather than through chaining,
and add a TODO to use promises which aren't connected to WebDriver's
control flow in the runner.

Closes #214.