(valAt set key) delegates to (valAt set key nil)
valAt doesn't need to consume stack space.

whereas get-canonical can't be tail-recursive, since it has to remember
the path it takes to perform path compression, valAt can be, since it
doesn't perform path compression.