Merge pull request dotnet/coreclr#1629 from ericeil/AsyncLocalPerf
Reduce allocations in AsyncLocal/ExecutionContext
1: Allocate a new AsyncLocal change notification list only if we need to add an item to the list.
2: Pre-size any collections we allocate, and manually copy into them to avoid IEnumerator allocations, etc.
3: Store the change notification list in an array, rather than a List, to avoid the extra List allocation.
Commit migrated from https://github.com/dotnet/coreclr/commit/
795786f0ac0e5ea82f288dfeb5b673845e1ef075