code: function toHTML (tree, options) {
    options = options || {}
    const s = new Serializer(options)
    let indent = 0
    if (options.compact) {
      indent = undefined
    }
    return s.serialize(tree, indent)
  }
docs: /*
  return a copy of this node where the second element is defintely the
  attribute object.  By calling this in all the right places, we allow
  people to omit that element.  Not sure yet whether that's a good
  practice.
  
  We might also want an in-place normalize-node or normalize-tree.
  
  function normalizedNode (node) {
  if (node.length === 0) {
  throw Error('cant handle empty nodes')
  }
  if (node.length === 1) {
  return [ node[0], {} ]
  }
  if (typeof node[1] === 'object' && !Array.isArray(node[1])) {
  return node
  }
  const result = node.slice(1)
  result.splice(0,0, node[0], {})
  return result
  }