updates: LocalCompiler-based interpreter

Use the intermediate compiler representation to build an interpreter.
This should result in more efficient packet evaluation in the case of
good variable orderings.

The interpreter relies on NetKAT_Semantics to interpret actions.
updates: eliminate redundant network updates

This commit implements two controller optimizations. Both avoid
redundant switch configuration updates by leveraging the efficient
equality checking of the LocalCompiler.

The first optimization performs an equality check on the controller's
current policy and the latest policy update the toplevel policy
application produced. If the equality check succeeds, then no switch
configuration needs to be updates and the policy update is discarded.

The second optimization is similar to the first, except applied to
per-switch policy updates. Even if the global policy update is not equal
to the controller's current policy, per-switch fragments may be equal.
Before each switch update is executed, the controller checks the
equality of the switch's current policy fragment against the policy
update that should be applied to the switch. If they are equal, then the
update is skipped. This optimization is only implemented for the best
effort policy update algorithm.

The controller now exclusively uses the LocalCompiler intermediate
representation to track the current network policy. If a NetKAT policy
is needed at any point, it can be recovered thusly:

  NetKAT_LocalCompiler.to_policy t.repr
Merge pull request #371 from frenetic-lang/updates

Network update optimizations