Improved backoff handling for async applications

This pull request improves backoff handling as described in #13.  More specifically,

* A `max_backoff_count` was added which adds an upper bound to the number of failures we report to a given task's backoff timer.  This puts a cap on the maximum backoff interval
* task failures are only reported to the backoff timer if we are not currently in a backoff state.
* When we come back from a backoff, the ready count is set to 1 to test the waters and see if we have fully recovered.