Attribute value refactor

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.