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 
this constructor is used in a very specific scenario: have a model (distinct from the parent's model) but no declared model type.  `typeof(object)` is the best possible guess if `model==null`.

if I remember correctly, this constructor is only used when we're creating the context for `@Html.PartialAsync()` and `@Html.RenderPartialAsync()`.  a partial view inherits everything from the calling view except `TModel`.  importantly however, it's passed a `Model`.

so what alternative do you suggest?