(PUP-3379) Don't retry if block raises fatal error

Previously, if the caller didn't specify which exceptions to retry, the
retry_action method would retry all exceptions, even SystemExit and
NoMemoryError, which should never be rescued.

This method modifies the retry_action method to always re-raise
SystemExit and NoMemoryError, even in the situation where the caller
asks for them to be retried.
(PUP-3379) Only rescue exceptions we intend to retry

Previously, we rescued all StandardErrors, checked if the rescued
exception is in the list of rescue-able exceptions, and re-raised if it
wasn't in the list.

Also, the caller was expected to specify the list of rescue-able
exceptions as a Hash, where the key was the exception, and the value was
the message to log when the exception was caught. That seemed a little
odd, and if that behavior is actually wanted, it would be better for the
caller to supply a callback for logging the message.

This commit modifies the retry action to accept an array of rescue-able
exceptions. If none are specified, it defaults to StandardError. The
retry action will only catch exceptions that it intends to retry,
simplifying the retry logic.
(PUP-3379) Eliminate extra counter

Previously, `retries` counted down from n to 0, raising when we got to
0. We also have a `failures` counter going from 0 to n, used to compute
the sleep time.

This commit removes the `retries` counter, since the check can be
implemented using the `failures` counter. This commit also simplifies
how the default options are handled, and adds documentation.