Unify our retry logic.

Summary:
Yes, this is the umpteenth iteration of the retry logic. But there are two
reasons to do it:

(1) retry_crispin will currently only retry a bounded number of times, which is
not ideal, since we expect it to retry every couple of hours. With this patch,
it uses our slightly-more-sophisticated failure counter, which resets if there
are no failures for a certain amount of time.

(2) retry_crispin also currently tries to log using logger.log(level, msg),
which is not supported by structlog.

A (trivial) patch updating the EAS code is also ready.

Test Plan: Unit tests updated and sync run.

Reviewers: spang, kav-ya

Reviewed By: spang, kav-ya

Subscribers: kav-ya

Differential Revision: https://review.inboxapp.com/D222