rework topology discovery/app interface

This pull request includes significant rewrites to the topology discovery module as well as the app interface. It is now possible to dynamically enable and disable topology discovery in the controller. By the default, the controller will start with topology discovery disabled. After creating a controller, users can manipulate its ctl object to enable or disable discovery.

Under the hood, this was accomplished by reorganizing the discovery code and enforcing a clear separation between the role of network applications and pipeline stages, which was facilitated by the app interface rework. The discovery application itself is no longer responsible for modifying the nib in response to network events. Rather, the app's purpose is now to define the policy for packets related to discovery as well as synthesizing packets related to discovery (e.g., switch probes). The task of modifying the nib has now been deleted to a `Stage.t` that will handle packet-in and other network event.

Closes #331.