Change `ViewDataDictionary` copy constructor to ensure `ModelMetadata` is never that for `object`

- `ViewDataDictionary<TModel>.ModelMetadata` was for `object` after base
 copy constructor got value from `ViewDataDictionary<object>`
- problem led to #1426 symptoms
- with copy constructor leaving `base.ModelMetadata==null` more often,
 `ViewDataDictionary<TModel>.ModelMetadata` usually tracks `TModel` if
 `Model==null`

nit:
- fix existing comment in main `ViewDataDictionary` copy constructor
- add some `<remarks/>` to the four `ViewDataDictionary` copy constructors

plus tests
the tests may be driving this choice :smile_cat:  but on the other hand, they're demonstrating an undocumented capability our users may be relying on.  that is our users may also be doing things like the following and expecting their `DisplayName` value to be used in the generated HTML.
``` c#
  helper.ViewData.ModelMetadata.DisplayName = displayName;
  ...
  @Html.EditorFor(m => m)
```

we had an offline conversation about this flow and I'm going to take a crack at updating the various `ViewDataDictionary` constructors to be more explicit about intent.