Optimize Future#then some more
Push down Promise#observe and Promise#try

Moving them to CompletableFuture allows much more compact expression of
the combinators.
Rewrite non-immediate combinators using recursion

This significantly cuts the implementation size by and should not
introduce too much function call overhead.
Avoid observe overhead for Future#map

Out of the combinators, this is the only case that does not rely on
pre-existing futures, auto detection, or rescuing errors, so the extra
verbosity seems like a reasonable trade-off.