Move consumer creation from Subscriber.start() into the run() loop,
matching the pattern used by Consumer. If the connection drops and the
consumer is closed in the finally block, the loop now recreates it on
the next iteration instead of spinning forever on a None consumer.
Previously, start() created the consumer once and run() assumed it
existed for the lifetime of the subscriber. A connection failure would
set self.consumer = None in the finally cleanup, and the outer retry
loop would re-enter with no consumer, causing an infinite
'NoneType has no attribute receive' error loop.
* Tech spec for graceful shutdown
* Graceful shutdown of importers/exporters
* Update socket to include graceful shutdown orchestration
* Adding tests for conditions tracked in this PR