Defines a collector with the given name and parameters. Collectors are navigators which add a value to the list of collected values and do not change the current structure.
Note that `params` should be a vector, as would follow `fn`. `collect-val-impl` must be of the form `(collect-val [this structure] body)`. It should return the value to be collected.
An informative example is the actual implementation of `putval`, which follows.
Defines a navigator with given name and parameters. Note that `params` should be a vector,
as would follow `fn`.
`select-impl` must be of the form `(select* [this structure next-fn] body)`. It should return the result of calling `next-fn` on whatever transformation the navigator applies to `structure`.
`transform-impl` must be of the form `(transform* [this structure next-fn] body)`. It should find the result of calling `nextfn` on whatever transformation the navigator applies to `structure`. Then it should return the result of reconstructing the original structure with the results of the `nextfn` call.