dns: throw if lookup() hostname is not string or null

Current behavior is C++ assertion failure. Closes #8187
> what do you mean by "passing undefined or false keeps working"?

Passing in a false-y value has a well-defined (if not terribly useful) meaning now, it calls the callback with a null hostname:

```
$ node -e \
  '[false,undefined,null,0].forEach(function(v) { require("dns").lookup(v, console.log) })'
null null 4
null null 4
null null 4
null null 4
```