move update-on-change! before first use.

clojurescript being compiled to javascript allows this (hoisted
variables), but it emits a warning and might be confusing/non-idiomatic.
support optional most types.

when those values are set to the default value, then the fields are
deleted.
fix the fallback for keywords.