* implementation is based on a copy of the EventSourcedBehavior and then
refactoring all things that are not needed or different such as:
* remove replicated event sourcing
* remove ReplayingEvents recovery phase
* remove retention and snapshotting
* remove SnapshotSelectionCriteria and snapshots
* remove PersistAll
* remove event handler, event types
* rename EventSourced
* single static tag
* DurableStateAdapter
* DurableStateSignal
* DurableStateStore plugin api with similar extension mechanism as query plugins
* DurableStateStore, DurableStateUpdateStore
* DurableStateStoreQuery
* note that the DurableStateStore can be pretty useful for other things also
* Loads of byte array copy/allocations squashed
* Use a central place for the proto unsafe instead of ad hoc
* Extra docs on serializer toBinary about not mutating bytes after returned
* Found some more toArray:s that can potentially benefit from being unsafe
* Array handed to user callback so extra docs needed
* Unsafe reading of underlying bytes of strings fixed
* Deprecate LevelDB
In preparation of moving into the testing infra (or deleting it completely) at some distant future point in time
* Remove leveldb tests where there also is an inmem one
* More details in deprecation text, recommend inmem + journal proxy for testing etc.
* Optimizes retrieval of mandatoryAttributes by removing potential allocation of OptionVal
* Optimizes ActorContextImpl by avoiding allocations inserted by Scala 2.13
* Optimizes Artery Codecs to avoid allocations associated with Scala 2.13 pattern-matching
* Avoid pattern-matching on OptionVal since Scala 2.13 allocates when checking the pattern
Before, for every round of `parse` a new buffer was allocated that was then
copied again by `ByteString.fromArray`. This effectively more than doubled
the allocation rate while inflating. For bulk data like expected for
compressed data this can make a big difference in throughput.
The slight downside of keeping the buffer is that the stage now uses more memory
by default even while idle. deflate/gzip's window is 64kb which happens to be also the
default `maxBytesPerChunk` setting. It is therefore expected that the additional buffer will
less than double the existing memory footprint while dividing the allocation rate
by more than two which seems like a good trade-off.