1. factory methods should return the type they are declared in
2. static factory methods should appear on DeferredResult and delegate to CompletableFuture, returning DeferredResult
3. other static methods on CompletableFuture should have a DeferredResult counterpart that compose DeferredResult objects as CompletableFutures and then call the corresponding CompletableFuture static method.
4. Don't cast DeferredResult to CompletableFuture - compose instead.