For a one-node allocation, this will be a Left [Ndx], whereas
for a two-node allocation, this will be a Right [(Ndx,
[Ndx])]. In the latter case, the list is basically an
association list, grouped by primary node and holding the potential
secondary nodes in the sub-list.

This is used when doing allocations, to understand better the
available cluster resources. The return value is a triple of the
current used values, the delta that was still allocated, and what
was left unallocated.

This is very similar to tryNodeEvac, the only difference is that
we don't choose as target group the current instance group, but
instead:

at the start of the function, we compute which are the target
groups; either no groups were passed in, in which case we choose
all groups out of which we don't evacuate instance, or there were
some groups passed, in which case we use those

for each instance, we use findBestAllocGroup to choose the
best group to hold the instance, and then we do what
tryNodeEvac does, except for this group instead of the current
instance group.

Note that the correct behaviour of this function relies on the
function nodeEvacInstance to be able to do correctly both
intra-group and inter-group moves when passed the ChangeAll mode.