ImmutableList.Builder: avoid copying

Defer copying the backing contents array until the builder is again
mutated after building a list. This avoids copying when the builder is
only used to create a single list, which is likely the most common case. 

This is implemented by adding a "frozen" flag to ArrayBasedBuilder that
is used to indicate that the builder is frozen. The backing contents
array will then be copied on the next call to add() or addAll().

This change also affects ImmutableSortedSet.Builder, due to it also
using ImmutableList.asImmutableList().