retryWhen/repeatWhen

Rebase and clean up of #1326 while Aaron is at LambdaJam.
move to the implementation.
```
    public static <T> Observable<T> retry(Observable<T> source, final long count) {
        if (count < 0) throw new IllegalArgumentException("count >= 0 expected");
        if (count == 0) return source;
        return retry(source, new RedoFinite(count));
    }
```