Queued channel syncs no longer get stuck

A sync waiting behind a long catalog read of another store now runs when its turn comes, and a sync that genuinely never starts now ends visibly and is retried.

What went wrong

Channel syncs share a worker. When one store's catalog read took a little over five minutes, a sync queued for another store behind it could be treated as stuck while it was still validly waiting.

That sync was then skipped but left showing as pending, and the store was only read again on its next hourly cadence.

What changed

GNIZDO now treats waiting in the queue separately from a sync that never reached the queue. A sync that is already queued keeps its place for up to an hour and runs normally when the worker reaches it.

If a queued sync still has not started after that, it ends as failed with a clear reason, and the existing limited automatic retry starts a fresh attempt. A sync no longer stays pending indefinitely.

What stays the same

Only one sync runs per store at a time, a sync is never executed twice, and a sync that never ran never changes the confirmed catalog.