flush when the completer's future is complete

Before we were relying on synchronous behavior in the
`completer.complete(value)` method, which is about to change (method is
becoming async by default); that was not bullet-proof either, because we
were assuming no async work in the user's continuation would follow our
flush.   By attaching the whenComplete() right before we pulse the
`complete`, we know that we are the last listener in the chain of
futures, so our `flush` should be the final computation.