sw_id: use sexp syntax extension in message module
sw_id: Make Client_id Hashable.S rather than Unique_id

There is no need to expose the fact that the Client_id module satisfies
the siganture Unique_id, as users should never need to create additional
identifiers. In fact, the user may want to synthesize identifiers from
information gleaned from outside of the system. It's sufficient that the
module supports data structures such as hastables and sets.
sw_id: replace Client_id.t with switchId in OF0x01

The OpenFlow0x0{1,4} implementations made a distinction between the
client_id used by the underlying Typed_tcp instance to keep track of
connections, and the switch_id (or datapath) corresponding to the
connection. This was for the purposes of making the implementations more
modular. If a user wanted to create a controller that would parse
OpenFlow 1.0 messages but did not actually implement the feature
request/reply part of the protocol, the user could do so.

Supporting this functionality is more trouble than its worth. The
Chunk-based implementation will continue to use client_ids to identify
switch connections, but versioned OpenFlow implementations will use the
switch_id (or datapath) to identify connections instead. Necessarily,
then, these implementations will gather switch features before notifying
the client code that a connection with a switch has been established.
sw_id: get features for OpenFlow0x04.Controller

The OpenFlow0x04.Controller is now at feature parity with 0x01 and is
capable of using switch_ids to identify connections.
sw_id: handle 0x04 multipart reply for port descriptions
txn: add support for RPC-like messages to Chunk controller
txn: Add support for RPC-like messages to OF0x01 controller
txn: Add support for RPC-like messages to OF0x04 controller
mulit: expose alternative create and listen functions

This commit introduces two new functions to the version-speific
Controller modules to enable reuse:

  * create_from_chunk : creates an OpenFlow0x0*.Controller.t from a
    Chunk.Controller.t. This allows a client to make use of
    version-specific functionality without requiring that the
    version-specific instance is managing controllers.

  * listen_pipe : generates a Pipe.Reader.t of events that's derived
    from a client-supplied source (as a Pipe.Reader.t). This gives the
    client the opportunity to filter and/or reroute certain events to
    other destinatins before the version-specific controller applies its
    Stage.t's.

Note that these functions are not exposed in the public API, but are
accessible to all the other modules within the async subpackage.
mulit: delete_all_groups in OpenFlow0x04_Core

delete_all_groups is a groupMod that will delete all the groups on a
switch.
mulit: add multi-version OpenFlow controller

The Async_SDN controller is a replacmeent for the Async_Highlevel
controller. It provides a similar interface for swith configuration while
increasing code reuse across existing version-specific OpenFlow
controllers and exposing more low-level switch events that must be
accounted for when creating more sophisticated that can run more robust
network applications (as is the case for frenetic).
multi: replace Async_Highlevel with Async_SDN
txn: remove echo and txn from public api, always install them
multi: implement connection monitoring for all version
multi: keep track of xids in ChunkController

The ChunkController keeps track of a per-connection xid that users can
use to generate new xids.
multi: only report usable ports in switch features

The abstraction layer does not expose any of the data structures
necessary for the user to determine whether or not a port is live or
not. The abstraciton layer therefore needs to make this determination
for the user by filtering ports in the initial feature request, and
surfacing events when ports come up or down.
multi: expose functions for message types

Rather than exposing low-level operations to send messages and deal with
xids, provide an async-based fucntion interface for dealing with those
methods. Currently suppor send_pkt_out and barrier.
Merge branch 'master' into multi

Conflicts:
	setup.ml
multi: add send_txn_with, use in barrier

Transaction-based messages always require the same error handling, with
the matching and transformation of the response being the only thing
specific to the original request. send_txn_with encapsulates the error
handling, and takes the message-specific response handling as a
function.
mulit: implement aggregate stats request for 0x01