Assigns Islands to IslandGroups, attempting to have a roughly equal number of constraints per IslandGroup. Each Island Group may be solved in parallel with the others and contains its own set of ConstraintContainerSolvers (one for each type of constraint) so that solver data access may be cache efficient during the solver phases.