Ports

Fixes hacky method of creating ports.  Ports are now chosen randomly from a range, and the port allocator first checks to see if those ports are free before marking them as in use.  When containers are destroyed allocated ports are returned to the range.  This is the core change to address Issue #57 and Issue #59.  Fixing these correctly will also require doing much of the the work for fixing #44 and #54.

@peterbourgon @ohm 
```go
log.Fatal("port range must start between 0 and %d", math.MaxUint16)
```