Codeplex-1570 - Lazy-Initialize Dictionary on ModelMetadata

We construct very many model metadata instances for the average request,
the current code creates a dictionary for each one that's used to store
context properties. None of the framework code uses these dictionaries,
they are provided for 3rd party extensibility -- so they will likely never
be read by most users' code.

As to the safety of this change, ModelMetadata has two different uses:
1. As a long-lived object that is cached
2. As a short-lived object that is only used by a single operation, on a
single thread

For #1, any intialization of the 'AdditionalValues' collection should
occur on creation - any other writes to AdditionalValues will have bugs in
the currrent implementation.

For #2, any reads/writes to 'AdditionalValues' are part of the same
operation and will not operate on shared data.

I've also included several instances of returning a readonly 0-length
array instead of a new 0-length array. This is always safe to optimize,
and these show up as hot spots when profiling memory usage of validation.