Cleaner implementation of UpdateShardStates + more tests

(Since we shouldn't assume pool implementation allows duplicate registration)
imho the cleanest way will be to just make 2 sets:
oldAddrs, newAddrs and then do:
remove from pool: "oldAddrs - newAddrs"
add to pool: "newAddrs - oldAddrs"