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 
I know we get the `ModelMetadata` for the right type later on, but could we do the equivalent of `GetModelType` here instead of passing in `typeof(object)`? Might make it seem a bit more obvious that we're using the best guess here for what the type of model.