Assorted DNS tests

***Don't merge this branch into master.***

***Warning: I changed the LabelDomainMixin validation order slightly. It may have subtly broken the validation process, although it didn't cause any tests to fail.***

**Resolves #663.**

---

### Tests written (or verified):

#659 (PTR):

- [x] Validate IP (reverse domain) is in range/network allowed in current container.
- [x] Don't validate that the target exists...
- [x] ...or that the Container has permissions for use of the target domain.
- [x] Make sure target is not an IPv4/6 address.
- [x] Don't allow if IP is already in use on a static interface – even if DNS is disabled!
- [x] Don't allow if another pointer with the same IP exists (round-robin setups are not allowed)
- [x] Don't allow if IP in dynamic range.
- ~~Optional: Allow partial completion of IP address by selecting a reverse domain from a list~~

#660 (AddressRecord):

- [x] Validate name uses domain allowed in AR's container.
- [x] If name already exists in a different container don't allow it to be created again.
- ~~If name exists in the current container, notify user existing A exists, allow them to ignore if they're attempting to create a round-robin.  Give user option to see existing matching object(s).  Include objects with DNS disabled!~~
- [x] Don't allow if the name already exists as a CNAME.
- [x] Backend version: Allow ARs with the same name iff they have the same container.
- [x] Allow ARs to share a name with a static interface iff they have the same container.
- [x] Validate target syntax – must be an IPv4/6 address.
- [x] Don't validate target IP is in any specific range/network we control. [I.e., it need not be in a Cyder range.]

#661 (CNAME):

- [x] Validate domain is allowed in this container
- [x] If name already exists in another container don't allow it to be created again in different container.
- ~~If name already exists in the current container, notify user existing CName exists, allow them to ignore if they're attempting to create a round-robin.  Give user option to see existing matching object(s).  Include objects with DNS disabled!~~
- [x] Backend version: Allow CNAMEs with the same name iff they share the same container.
- [x] Don’t allow if name already exists as an A, MX or SOA – CName cannot be at the same level as these record types.  Give user option to see existing matching object(s). Include objects with DNS disabled!
- [x] Do not verify that the domain/fqdn of the target is in Cyder or that it exists.  Only validate that it is a valid hostname and is not an IPv4/6 address.
- [x] Just to be clear, a CNAME is not allowed to share a source name with a static interface.
- ~~Optional: Implement support for short names (the target is assumed to be a fqdn in a few places so this might cause problems)~~

#662 (generic DNS stuff (MX, SRV, SSHFP, TXT)):

- [x] Validate name uses domain allowed in current container.
- [x] Name should be unique for MX, SRV, and SSHFP records.
- [x] Duplicate TXT records are okay.
- [x] Don't allow MX record if the name already exists as a CNAME.
- [x] ... (<del>SRV</del>, SSHFP, and TXT are okay) [RFC 2782 requires an SRV's first two labels to start with an underscore, which means we'll never have a name conflict between an MX and an SRV]

#664 (SOA, NS, and Domain):

- [ ] \(???) SOAs can only be created/edited by cyder admins or above
- [ ] \(???) Domains can only be created/edited by cyder admins or above
- [ ] \(???) NS records can only be created/edited by cyder admins or above

---

***Don't merge this branch into master.***