[x] On startup, app decides how many shards it should process by looking at
number of active (not closed) shards
number of distinct workers processing the shards
[x] Register intent to take over a shard via DynamoDB state table
[x] Shard processor processing a shard checks regularly whether another worker wants to take over
[x] Shard processor gives up processing of the shard
[x] Other worker takes over and deletes the handover request
[x] Handover request contains an expiration, if the handover wasn't completed by then the shard is fair game to any worker that can lay claim to it first
[x] Add new StoppedReason for handover and include it as reason that are checked for unprocessed shards
[x] Make frequency of attempts to balance load (by requesting handover from other workers) configurable
[x] Make frequency of checking if there's a pending handover request (in the shard processor) configurable
When another worker starts it should be able to negotiate with the first worker to split workload across the two of them.