node: begin mitration of core domain to startup

Now using_domains will not be set until an async listener has been
passed. Parts of core domain functionality have been migrated to startup
so users can take advantage of the new API. This way use of "domains"
doesn't first rely on loading the domain module, but instead they'll be
able to setup their own domain-like functionality from scratch.

This is not complete as it requires some hacks to pass around the domain
array and the domain flag object. Basically I need to hammer down the
exact API users should be using, then reimplement domains with it.

Also, it might be incorrect to only setup domains internally when an
async listener is passed because it would be possible for users to
create their own domain objects and pass those. But in that case all
users would need to do is setup a domain object, with the added field of
a callback, and the actual callback function would just be passed.