I did a quick test to see how it feels and I do like it. I'll update the review with this change plus the other suggested ones.
Good. How about calling future.result(), and letting it raise
InvalidStateError ? (Except if the timeout handler was called.)