Added cache for builtins to avoid parsing function names.
Added unique identifier to Program objects.
Shared interpreter caches persist across kernel invocations.

Per-program interpreter state is retained until program is destroyed,
and re-used for each kernel invocation belonging to that program.