Add optimization for ImmutableList<T>.AddRange

...when adding non-empty range to non-empty list

The AddRange method in `ImmutableList<T>` currently adds the items in a loop, rebalancing after each add.

This PR will add the entire enumerable in one batch, giving a significant performance improvement

85% improvement when adding an array to to an immutable list
98% improvement when adding an immutable list to an immutable list

Can you add your  VerifyBalanced(list.Root); here within the loop as well?