Used an init func instead of initialisers

Ends up slightly neater. (Also note Error goes from os.Stdout to
os.Stderr)
Substituted checkFatal for repeated if err == nil
Changed Lock to RLock when matching
Refactored indexOf*
Made zone return errors and http idempotent

The Zone DB tells you if you have a duplicate or missing record, but
the HTTP server smoothes these over.
Factored out more (but different) err != nil code
Factored out HTTP error + log
Complete multicast requests on first response

This is the simplest thing that works, is consistent with what happens
if there's a local answer, and avoids having all multicast requests
last 250ms or more.

Since we're no longer waiting *at least* the timeout period, I've
bumped the multicast response timeout up to half a second.

There was also a bug whereby the query would be entered into the
inflight map even if the socket write had failed (and the channel had
been closed).
Factor out testing error checks