Retry package based on Sean's composition design with essential logical refinements / fixes

Added more tests, custom error structs and fixed logic in essential parts: For this introduced a tristate as decision output of retrier and specified an evaluator for composed strategies.

We use three output values, Retry, Ignore and Abort. To evaluate composed strategies:

```
// We retry (output Retry) if one or more retriers evaluate to Retry and none says Abort 
// To output Retry some can also evaluate to Ignore as long as one evaluates to Retry.
// If all evaluate to Ignore we will return Ignore (this should be output for a successful attempt whose response will be returned as is and we may stop retrying).
// If one evaluates to Abort we'll return Abort regardless what the others returned
```

To optimize the evaluation by the strategies.RetryBy function we make use of arithmetic properties of the values representing the states.


If you want to go with this renaming - keep in mind that the package name will be included in the call site for the naming.  So this will read `retry.RetryBy`, so why not `retry.By` or `retry.All`?