More intuitive way to add port bindings: new abstraction "PortBinding"

The use of Ports for adding port bindings requires knowledge of the
internal data structure used for storing port bindings in Docker API.

This commit adds a more intuitive alternative that works like the
--publish option of the Docker CLI and some builder methods like
withBinds(Bind...) and withLinks(Link...).
Allow port-only as a legal syntax for ExposedPort.parse(String)
Parser for PortBinding and Binding

This allows you to use textual port binding specifications in the format
used by the Docker CLI in docker-java:

StartContainerCmd.withPortBindings(PortBinding.parse("80:8080/tcp"));
Binding: Port and IP may be null

In Docker API, an undefined IP address is expressed as "".
This is not intuitive and should be hidden from the user.
Likewise, docker-java uses 0 for an unspecified port number.
This also is not intuitive, especially if you consider that 0 is a legal
port number.

This change makes the undefinedness explicit by using null in both
cases. When serializing, "" is used instead of null.
This implies changing the type of hostPort from int to Integer.
fixup Binding.toString