Modifying ViewDataDictionary and ModelStateDictionary to copy on write instead of eagerly copying.



Partial fix for #878
sorry, my never-`null` understanding was wrong.  Guess there's a special case for `ViewDataDictionary` (but not `ViewDataDictionary<T>`) when `Model` is `null`.

So please `Assert.NotNull(viewData.ModelMetadata)` with either a non-`null` model or in a separate test using `ViewDataDictionary<T>` (where `ModelMetadata` will definitely never be `null`).