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.