Use atomic collections to make sure all of the memory contents are visible from writing to reading thread.
Added Random test for ShardAllocator.

This test will make random allocation decision on a growing and
shrinking cluster leading to a random distribution of the shards.
After a certain amount of iterations the test allows allocation unless
the same shard is already allocated on a node and balances the cluster
to gain optimal balance.