The entirety of `createInterpreter` is an impressive piece of wizardry.  Would you mind adding some comments throughout to explain what happens at each step.  I'm not sure I understand what `wrapper` wraps and what's being done with it once it's handed off to `createNativeFunction`).

(Similar comment about `nativeFunc`.  Usually, I think of of a native function as something written in C++ that resides inside the browser ... but it looks like the array of VWF kernel function names is what is handed to it as a parameter.  That's just a little confusing to me.)