emit-document, defemitter, :data op, multimethods

* add emit-document function
* add defemitter macro
* add :data op
* refactor to use multimethods in some places

```clojure
(def doc
  [:group [:data {:type :symbol, :text "map"}]
          [:line]
          [:data {:type :symbol, :text "capitalize"}]
          [:line]
          [:data {:type :string, :text "\"abcdef\""}]])

(emit-document doc {:width 4})
```