Refactor attribute values

Attribute values are no longer represented as arrays in the AST. Instead
an attribute value is either a TextNode or MustacheNode. If the
attribute contains both text and mustache parts, they are concatenated
via the CONCAT helper. Examples:

- class="btn-large" parses as `text("btn-large")`
- class="{{status}}" parses as `mustache("status")`
- class="btn-large {{status}}" parses as
  `mustache("CONCAT", params: [string("btn-large "), id("status")])`

Consequently, the ATTRIBUTE hook no longer accepts arrays and instead
expects a value.
Sync simple-html-tokenizer

Sync simple-html-tokenizer to commit tildeio/simple-html-tokenizer@fa0717334a389e43342ee40ecd25d560003f1962.
Add support for web components

This commit introduces a new hydration hook that allows HTMLBars to integrate
with web components. The hooks has the signature

   WEB_COMPONENT(placeholder, tagName, context, options, helpers)

and is generated along with a placeholder whenever the compiler encounters an
HTML element with a hyphenated tag.

Compiler changes:

- a new ComponentNode which is a mix of ElementNode and BlockNode. It has the
  signature `ComponentNode(tag, attributes, program)`.

- a new hydration opcode `component` similar to the `helper` opcode.