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.
How about having a single ErrPortsConflict error, defined like this:
```go
// ErrPortsConflict is returned when two port ranges conflict.
type ErrPortsConflict struct {
    a, b PortRange
}

// Error implements error.Error().
func (e *ErrPortsConflict) Error() string {
    prefix := "port ranges conflict"
    switch {
        case e.a.FromPort == e.b.FromPort && e.a.ToPort == e.b.ToPort:
            return fmt.Sprintf("s: %d-%d is the same as %d-%d", prefix, e.a.FromPort, e.a.ToPort, e.b.FromPort, e.b.ToPort)
        case e.a.FromPort == e.b.FromPort, e.a.FromPort == e.b.ToPort, e.a.ToPort == e.b.FromPort, e.a.ToPort == e.b.ToPort:
            return fmt.Sprintf("s: %d-%d overlaps with %d-%d", prefix, e.a.FromPort, e.a.ToPort, e.b.FromPort, e.b.ToPort)
        case e.a.FromPort < e.b.FromPort && e.a.ToPort > e.a.ToPort:
            return fmt.Sprintf("s: %d-%d includes %d-%d", prefix, e.a.FromPort, e.a.ToPort, e.b.FromPort, e.b.ToPort)
        case e.a.FromPort > e.b.FromPort && e.a.ToPort < e.b.ToPort:
            return fmt.Sprintf("s: %d-%d includes %d-%d", prefix, e.b.FromPort, e.b.ToPort, e.a.FromPort, e.a.ToPort)
        default:
            // No conflicts.
            return ""
    }
}

// IsErrPortsConflict returns whether the given error is ErrPortsConflict.
func IsErrPortsConflict(e interface{}) bool {
    _, ok := e.(*ErrPortsConflict)
    return ok
}
```

Then, in CheckConflicts, you only need to do this:
```go
// CheckConflicts determines if this range conflicts with the given one.
// An error satisfying IsErrPortsConflict() is returned on a conflict.
func (a PortRange) CheckConflicts(b PortRange) error {
    if err := a.Validate(); err != nil {
        return err
    }
    if err := b.Validate(); err != nil {
        return err
    }
    if a.Protocol != b.Protocol {
        return nil
    }
    if err := &ErrPortsConflict{a, b}; err.Error() != "" {
        return err
    }
    return nil
}     
```