GearClient.add ports argument (fixes #149)

In this branch I've:
 * Added a `ports` argument to `GearClient.add` , which
 * accepts a `list` of `PortMap` instances, and
 * defaults to an empty `list` .
 * Added a `PortMap` record type.
 * Added functional tests which start a  gear unit running a simple http server and
 * sends an HTTP request to the configured external port
 * checks the HTTP response contains the expected body

Things I'm not sure about 
 * whether to add custom exceptions for the case where the chosen external port is already assigned
 * whether to allow setting a protocol (tcp, udp) and IP address as part of the port mapping
 * whether the `loop_until2` function is necessary and
 * whether it would be better to add a looping call to `systemctl is-active` to wait for the container unit to be ready, rather than just continually attempting http requests.

Fixes #147

@tomprince Made the same point in https://github.com/ClusterHQ/flocker/pull/132#discussion_r14164130 and I found @exarkun had already raised https://github.com/hynek/characteristic/issues/4. 

Not sure how to assert that the `@attributes` decorator was used. Perhaps we can check the identity of the `__init__` method against that of a naked class decorated with `@attributes`

Maybe `@attributes` should set some sort of marker?

Anyway, I'll leave this for now.