Sanitize "id" attributes for HTML 4.0.1

- change `@Html.Id()` to sanitize return value; was identical to `@Html.Name()`

Copied `TagBuilder.CreateSanitizedId()` and `TagBuilder.Html401IdUtil` from MVC 5.2
- except this `CreateSanitizedId()` returns a valid identifier if first `char` is not a letter
 - e.g. "[0].Name"

nits:
- expand variable names, use lots of `var`, put `public` members first
- add doc comments for `CreateSanitizedId()`

Note users will be able to apply different sanitization once we fix #1188.

/cc @pranavkm
the properties passed in here (`IHtmlGenerator.IdAttributeDotReplacement` or the same-named property in `IHtmlGenerator` that calls through to the one in `IHtmlGenerator`) are publicly-settable. there is an issue w/ this that I'll fix in the next iteration -- initialization is currently done in the `HtmlHelper` constructor, not the `DefaultHtmlGenerator` one.
however letting users shoot themselves in the foot is a tried-and-true principle :smiling_imp: could however do validation in the property setter if anyone feels strongly. LMK.