Minor cleanup and (potential) optimization in compiler

Currently, the code generates calls to getCursor for every channel from 0 up to the
max channel referenced in filters/projections. With this change, the code now only
calls getCursor on channels that are actually needed for evaluation.
Rename getHandle() to getSignature() in FunctionInfo
Revert "Minor cleanup and (potential) optimization in compiler"

This change introduced a bug but didn't cause unit tests to fail due to
automatic fallback to interpreter if compilation doesn't work.

This reverts commit 59e0cbabf465563c111350de9896e7019a81f01b.
Add config option to disable interpreter fallback

The option is compiler.interpreter-enabled. When set to false, if the engine
fails to compile an expression to bytecode, the query will abort instead of
falling back to interpreted mode.

LocalQueryRunner and DistributedQueryRunner are now configured with that option
off so that we can catch certain subtle bugs in the compiler during unit testing .
Minor cleanup and (potential) optimization in compiler

Currently, the code generates calls to getCursor for every channel from 0 up to the
max channel referenced in filters/projections. With this change, the code now only
calls getCursor on channels that are actually needed for evaluation.

This is a re-do of 59e0cbabf465563c111350de9896e7019a81f01b (reverted in 87981e7bccfabacb001973193c4b7f120cc308a5)
with the bug fixed.