Spent some time today on technical debt. Tracked down a debug assertion showing up in runtime. Turned out to be inconsequential. Resolved that and added logging for stopped-on-destruct of dynamic objects (in addition to the refcount logging that's implemented via CRTP). Applied the new resubscriber template for session stop handling, which allows the seed session to be removed once complete (vs. staying around until shutdown). That worked out well, so I'll end up applying that in a couple more places.
I also applied it to public channel and stop subscribers. This allows the subscriber to return true/false in the event handler, to direct continuing subscription vs. unsubscribe. It also provides a handle upon registration which can be used to explicitly unsubscribe. This makes the subscribers much more dynamic (formerly process lifetime). Finally, I also applied this dynamic model to the optionally-retained handler for manual connections. By returning false at any connect success/fail even, the subscription (and manual connection cycle for it) is dropped. And while a connection exists, the subscriber can just stop it at any time. So good flexibility all around on subscriptions now.
(edited)