Add a RetryableAspect

This change adds a RetryableAspect.  The Retryable aspect allows a method
to be annotated with an @Retryable annotation to cause automatic retries
in the case of an exception.

This is particularly useful in cases where data is being written in a
way where a conflict exception may occur.

The @Retryable annotation takes 3 arguments:
  maxRetries - The maximum number of retries.  Defaults to 0.
  retryOn - The list of exception classes to retry on.  Defaults to all.
  retryDelayMillis - The delay between retries in millis.  Defaults to 0.

The @Retryable annotation works in much the same way as the
@CircuitBreaker and @PerformanceMonitor annotations, and so all of
the same caveats apply.  Trying to call an @Retryable method from within
the same instance will bypass the proxy and result in no retrying.
Reworked RetryableAspect to use ServiceRetrier

This change updates the RetryableAspect to use the ServiceRetrier for
retries.

As part of that the options for the Retryable aspect were
reworked, and also the retryOn and throwCauseException options were
added to ServiceRetrier.

And also the unit tests for ServiceRetrier needed some TLC (and
renaming).

Amended commit message for the entire change:

Add a RetryableAspect

This change adds a RetryableAspect.  The Retryable aspect allows a method
to be annotated with an @Retryable annotation to cause automatic retries
in the case of an exception.

This is particularly useful in cases where data is being written in a
way where a conflict exception may occur.

The @Retryable annotation takes 5 arguments:

  maxTries - The maximum number of tries.  Defaults to 2.

  retryOn - The list of exception classes to retry on.  Defaults to all.

  retryDelayMillis - The delay between retries in millis.  Defaults to 0.

  doubleDelay - Doubles the delay between retries.  Resets after a
    success or after maxTries is reached.

  returnCauseException - Specifies whether the root cause Exception
    should be thrown, or whether a generic Exception("Call failed n
    times") should be thrown.

The @Retryable annotation works in much the same way as the
@CircuitBreaker and @PerformanceMonitor annotations, and so all of
the same caveats apply.  Trying to call an @Retryable method from within
the same instance will bypass the proxy and result in no retrying.
Rename returnCauseException to throwCauseException

This change renames returnCauseException to throwCauseException to make
it clearer what the option means.

The documentation in the previous commit already showed this change and
so it is proper.
Merge pull request #22 from weggert/master

Add a RetryableAspect that uses Service Retrier with a few adds/modifications