Sanitize the string tag passed to DOM components

Because we're using innerHTML to generate DOM Elements, we need to make sure that the tag is sane and doesn't try to do injection.

This wouldn't be an issue if we used document.createElement instead.
Even though `NameStartChar` includes `_`, it does not actually appear to be parsed as a tag by any browser: `document.body.innerHTML = 'a<_A id="<b>b</b>">c';`