[CORE] Ensure GroupSahrdsIterator is consistent across requests

GroupShardsIterator is used in many places like the search execution
to determine which shards to query. This can hold shards of one index
as well as shards of multiple indices. The iteration order is used
to assign a per-request shard ID for each shard that is used as a
tie-breaker when scores are the same. Today the iteration order is
solely dependent on the HashMap iteration order which is undefined or
rather implementation dependent. This causes search requests to return
inconsistent results across requests if, for instance, different nodes
are coordinating the requests.

Simple queries like `match_all` may return results in arbitrary order
if pagination is used or may even return different results for the same
request even though there hasn't been a refresh call and preferences are
used.