Rework `ViewDataDictionary` to ensure `ModelMetadata` is never `null` (#1466)

This is the reanimation of #1453, now done against dev.  No significant changes from that PR after I addressed comments there.

See individual commits for details.

/cc @pranavkm @rynowak @yishaigalatzer 
could you clarify what's missing?  a number of tests already confirm that behaviour.  e.g. have tests that check `ModelMetadata` after constructing a `ViewDataDictionary` from scratch (so `_declaredModelType==typeof(object)`) with `_model != null`.  also have `CopyConstructors_InitalizeModelAndModelMetadataBasedOnSource()` above.