A request can fail after a VM has been cloned, for example while
creating its request wrapper or installing the nginx pool cleanup.
The failed VM was neither destroyed nor returned to the reuse queue,
and a partially evaluated module could leave timers armed against it.
A second initialization attempt could then access rejection state from
the destroyed VM.
Keep each clone private until setup succeeds. On failure, cancel its
events, detach request state, and destroy the VM and engine pool for
both engines. Also clean up partially initialized QuickJS contexts and
wrapper objects.