SI-8689 Avoid internal error in Promise after sequence of completions

Calling `completeWith` when the `DefaultPromise` is already completed,
leads to callbacks not being properly executed.

This happened because `Future.InternalCallbackExecutor` extends
`BatchingExecutor` which assumes `unbatchedExecute` to be async,
when in this case it is sync, and if there is an exception thrown
by executing the batch, it creates a new batch with the remaining
items from the current batch and submits that to `unbatchedExecute`
and then rethrows, but if you have a sync `unbatchedExecute`, it will
fail since it is not reentrant, as witnessed by the failed `require`
as reported in this issue.

This commit avoids problem by delegating `completeWith` to `tryComplete`,
which has the effect of using `onComplete` + `tryComplete` i.s.o. `complete`,
which means that when it fails (because of a benign race condition between
completers) it won't throw an exception.

It has been tested by the minimized reproducer.
Followup to SI-8689 deprecates `completeWith`, recommends `tryCompleteWith`

Given that there's no one to report a failed (benign) race condition between
multiple completers for a `Promise`, this commit deprecates `completeWith`
in favor of `tryCompleteWith`, which more accurately describes potential
conflicts.

This commit also adds an optimization to `tryCompleteWith` for
`DefaultPromise` which uses the "root linking" feature to link a yet
uncompleted `Promise` to the `Promise` which is desired to complete this
Promise with.