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

Adding batches with a size that is a power of 2 for a balance test seems rather specific. I'd like to see a test or two that include random or at least several different sizes (odd numbers, etc.). If you use random, please print the rand seed in the test output (for reproducibility if it ever fails).