Use thread names everywhere.

Sometimes we name a thread both via its ExecutorService
and via a NamedRunnable. The ExecutorService thread needs
to be named because threads are cached and will be visible
in a thread dump even when no runnables are running.

NamedRunnables are also used because they provide additional
context: the host or URL being serviced by a thread.