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 
- :-1: this is about _setting_ `_declaredModelType`, a field `GetModelType()` depends on
- but I'll add a comment about "best guess" since this is an area that's led to a few questions