[WIP] make ASTs cachable

`FormaterMap` -> `dynamic userData`. Come up with better name?