retryWhen/repeatWhen

Rebase and clean up of #1326 while Aaron is at LambdaJam.
Because there was a couple levels of indirection before it got to the actual `create()` and it was starting to bloat the Observable.java and be annoying to have to jump between files to see what was going on.
```
    public static <T> Observable<T> retry(Observable<T> source) {
        return retry(source, REDO_INIFINITE);
    }
    public static <T> Observable<T> retry(Observable<T> source, Func1<? super Observable<? extends Notification<?>>, ? extends Observable<?>> notificationHandler) {
        return create(new OnSubscribeRedo<T>(source, notificationHandler, true, false, Schedulers.trampoline()));
    }
```