natsmsg: keep the heartbeat alive through transient InProgress failures
Commit

KeepInProgress exited its goroutine on ANY InProgress error, so one dropped extension during a NATS blip (reconnect-buffer overflow, flush timeout) silently forfeited the rest of the handler's runway — AckWait then expired mid-run and the delivery redelivered concurrently to another replica, the duplicate the heartbeat exists to prevent.
Only permanent failures stop the heartbeat now: the delivery was already terminally disposed (Ack/Nak/Term racing the final tick) or carries no reply subject, matched against both the jetstream and legacy nats.Msg sentinel errors since the callback may wrap either. Transient failures keep ticking, still bounded by the existing 15-tick cap, so the extension resumes when the connection recovers.
Entire-Checkpoint: 71b20e115766