Rewrite rule syntax

Rules now define one signature; logical AND functionality is
implemented with rule chaining. Rules also contain an
additional k/v entry, opts, which define options specific to
a given rule (e.g. logic to implement chaining, ignoring
logging, etc).

Breaks rule processing into a separate function. A phase-local
context table is introduced to pass exec-scope data (such as
chaining flags and debugging info) into the rule processor.

Fixes a logic error that would stop all remaining rules in a
ruleset from processing if one rule was ignored.

Uses microsecond precision via FFI to track execution time.