By the way, I just had an idea. We could even write the `annotate`, `type`, and `rep` functions in Arc:
(def annotate (type rep)
(fn (m . args)
(case m
'type type
'rep rep
(apply attr rep m args))))
(def type (x)
(attr x 'type))
(def rep (x)
(attr x 'rep))
So calling `annotate` on a value would create a wrapper around it. But this also allows us to do something else... modify the type of an existing value, rather than wrap it.