Update port conflict checker to distinguish between conflicts and exact matches.

This is a fix for #1359837 (https://bugs.launchpad.net/juju-core/+bug/1359837).

Opening a port that is already open should not result in an error.
Just trying to understand what we're checking here:
```go
a := PortRange{FromPort: 1000, ToPort: 2000}
b := PortRange{FromPort: 1999, ToPort: 1001}
```
In the case above this if block will return ErrPortsConflict, but:
 - We're not checking ToPort <= FromPort (and possibly swapping them if so)
 - b as defined is not a valid range, but if b was {FromPort:1001, ToPort: 1999} (a valid range) ErrPortsConflict won't be returned, but it should as there is indeed conflict / overlap.

So I think there are about 10 cases to check:
 1. if a.FromPort > a.ToPort => "%d-%d is not a valid port range", a.FromPort, a.ToPort
 2. if b.FromPort > b.ToPort => "%d-%d is not a valid port range", b.FromPort, b.ToPort
 3. if a.FromPort == b.FromPort && a.ToPort == b.ToPort => ErrPortsMatch
 4. if a.FromPort < b.FromPort && a.ToPort > b.ToPort => ErrPortsConflict (a completely includes b)
 5. if b.FromPort < a.FromPort && b.ToPort > a.ToPort => ErrPortsConflict (b completely includes a)
 6. if a.FromPort < b.FromPort && a.ToPort < b.ToPort => ErrPortsConflict? (a overlaps partially with b)
 7. if b.FromPort < a.FromPort && b.ToPort < a.ToPort => ErrPortsConflict? (b overlaps partially with a)
 8. (only 2 cases left: a before b, b before a - in both cases no overlap or conflict) => nil