detect failures in wait() calls on Pollable models

Now the polling uses a has_failed task to detect failures
and throw an exception.

Also cleaned up the wait logic on Hosts to deal with valid
404 cases in a better way.

Fixes #6