OFDNSResolver: Use a delegate for async operations

Because there is usually only one resolver per thread, having the
delegate as a property on the resolver would not work. It is therefore
passed as an argument.

This only changes the public API so far. Internally, the old target /
selector / context pattern is still being used. This will be changed
later.