!con #15496 Make entries of shards persistent

- Move all entry related logic out of the ShardRegion and into a
  new dedicated child `Shard` actor.
- Shard actor persists entry started and passivated messages.
- Non passivated entries get restarted on termination.
- Shard Coordinator restarts shards on other regions upon region failure or handoff
- Ensures shard rebalance restarts shards.

Refs #15496 
@patriknw After testing it turned out to be null, so on line 1560 during a snapshot read I added;

```scala
Option(state.unallocatedShards) match {
  case Some(_) ⇒ persistentState = state
  case None    ⇒ persistentState = state.copy(unallocatedShards = Set.empty)
}
```