SI-8042 Use Serialization Proxy Pattern in List

Modify List to use the Serialization Proxy Pattern instead of
directly mutating its state during deserialization.

Use the proxy at the List level for both Nil and :: for simplicity.

Change one member variable (hd) to val from var as a result.  The
other member variable (tl) cannot yet be changed to val because
it is mutated by ListBuffer in the library and Types in reflection.
Merge pull request #3233 from scottcarey/SI-8042

 Use Serialization Proxy Pattern in List