DNS: auto-retry if we get an error on send/recv to DNS server.

A few people have reported that they have one or more invalid DNS servers in
/etc/resolv.conf, which they don't notice because the normal resolver
library just skips the broken ones.  sshuttle would abort because it got an
unexpected socket error, which isn't so good.
Don't try to connect to remote IPs that start with zero.

For some reason, on Linux servers this returns EINVAL.  I don't like just
treating EINVAL as non-fatal in general, so let's catch this specific case
and ignore it.

Reported by Reza Mohammadi on the mailing list.  Interestingly, it's kind of
hard to trigger this crash since the client would have to request the
connection, and that connection shouldn't exist because the original client
program would have already gotten EINVAL.  But my MacOS machine can generate
such a connection, so a MacOS->Linux sshuttle could trigger this.
Dereference symlink for sshuttle launch script

(Modified slightly by apenwarr)
runpython.do: also compile for ppc architecture.
Handle EHOSTDOWN, ENETDOWN.

Someone on the mailing list reported getting these.

Also centralize the list of these errors, so we don't have different parts
of the code supporting a different subset of them.  Now just use
ssnet.NET_ERRS.
ssh.py: use 'exec python -c' instead of just 'python -c'.

This gets rid of an extra intermediate sh process on the server that we were
keeping for no good reason, since it would exit as soon as python exited
anyway.
Insert two binary NUL bytes (\0) before SSHUTTLE0001 sync string.

...and search for those null bytes before looking for the sync string.

This helps when people have misconfigured .bashrc to print messages even in
non-interactive mode.  (On my Debian Lenny system, .bashrc doesn't seem to
run when you do 'ssh localhost ls', but on MacOS servers, it does.  Hmm...)
Add some friendly info to the README
ui-macos/bits/runpython.do: auto-determine arches to build for.

Some people don't have all of them installed, so auto-detect them by
looking at the available arches in /usr/libexec.
./do: use the latest minimal/do from the redo project.
ui-macos/models.py: fix a compatibility problem on MacOS for PPC.

@objc.accessor isn't the right thing to use for a Core Data Validation
function.  Yowee, PyObjc sure is non-obvious.
README.md: fix little bug

The ssh hostname should immediately follow the -r parameter.
ui-macos/bits/runpython.do: report which platforms we're compiling for.

Just as a quick reminder, in case you're building a fat binary and you don't
have all the architectures actually installed.
ui-macos/bits/runpython.do: skip ppc64 architecture.

I don't have a Mac that can build it.  Hopefully ppc will run fine on ppc64.
helpers.py: errno is used by this module, but not imported.
ssnet.py: deal with a possible connect/getsockopt(SO_ERROR) race.

Seems to affect Linux servers.  Ed Maste says the patch fixes it for him.
Pass socket through to handlers. Required for IPv6 support.
Send DNS request back on same sock we received it on.
Move nested functions to top level.
ipfw: don't use 'log' parameter.

I guess we were causing the kernel to syslog on every single packet on
MacOS.  Oops.