This allows us to support asynchronous importers and, eventually,
functions without breaking synchronous support. The copies were made
manually, but the eventual plan is to auto-generate the synchronous
versions by stripping all asynchrony from the async versions.
See #9
This also adds built-in function overloading. This adds some extra
layers to the default function-call logic which could be avoided by
handling overloading purely in the callbacks of functions that require
it, but it's not clear how to share logic gracefully between the perform
visitor and function helpers.