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

:question: These tests don't cover all edge cases... `==` and `=!` follow different code paths. But we're relying on characteristic in a bunch of places, and rewriting these tests each time seems annoying. Can we just assert "the characteristics.attributes class decorator was used" somehow? If not, this is probably sufficient.