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 
the change is required because `viewData.ModelMetadata` is now never `null`.  and, in the peculiar context of HTML and tag helpers, `string` is a better guess than `object`.  otherwise `@Html.Editor()` would display nothing instead of a textbox.

these helpers (almost all indirectly use `ExpressionMetadataProvider`) can be invoked in contexts where `TModel` is unknown.  that's why the previous code used `string` and why I've maintained that fallback.  but the fallback should be needed much less often with the other changes and always occurred only when `model==null`.