A failed exec can return after its job has already released the vertex.
Cloning its error refs at that point leaves them outside the cleanup path
and keeps their cache records in use.
Retain cached error refs through cloneUntilRelease so cloning and cleanup
registration are protected by the solver lifetime lock. Remove the separate
sharedOp ref bookkeeping and add a deterministic regression test for an
exec error returned after job discard.
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>