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

Please avoid changing existing unit tests. Add new ones instead. Existing unit tests may be deliberately testing very specific cases that aren't obvious and changing them may eliminate the test for that unique case.