This commit introduces several basic building blocks
for replication providers:
* PoolReplicaProvider returns replica from the prepopulated pool (that
can become empty over time). Released replicas are returned to the pool.
* RoundrobinReplicaProvider returns items from the prepopulated
list. When the list is exhausted it returns them again thus reusing
the items. This is usually needed to spread the load between
fixed number of servers or other cloud resources.
* CompositeReplicaProvider allows to combine several replica
providers into one. When new replica is requested it tries to
obtain it from the underlay providers one by so if the first
replica provider goes out of resources the second is used
for further allocations.
Also refactor replica release interface to better handle
down-scaling by more than 1 item
Change-Id: I923b2c6d0cd3a881be323399b7b13481e9a4a459