Reduce memory footprint and data copying

@JakeWharton 

There are three improvements here:

* Deserialize repeated fields directly into an externally-immutable form
* Get rid of expensive TreeMaps to store extensions on messages
* Iterate over extensions more cheaply when serializing