Fix issue #321: the result of a Future can be another Future, so we unroll them until we have an actual result

Recursively call onComplete when a Future results in another Future or AsyncResult, until we have an actual result which can be rendered in the servlet response.