### Describe the bug

TL;DR: if you supply custom DNS `lookup` in 1.6+ and it fails with `ENOTFOUND`, `axios` throws `TypeError: address must be a string` instead

I supply custom DNS `lookup` to precisely control the timeout. I am using https://github.com/szmarczak/cacheable-lookup. It works correctly in axios before 1.6 but fails after because of this change:

![image](https://github.com/axios/axios/assets/498673/50a0e6ba-7fe0-4b03-b5c9-6b05d7b4cfa1)

When the callback returns the `err` as the first argument, the other two can be (and are) `undefined`. Axios 1.6+ attempts to resolve `family` and `address` regardless of `err` and trips over `undefined`.

Take a look:

![image](https://github.com/axios/axios/assets/498673/5ee84a2e-361b-4bd0-a589-85d81fe9208e)


### To Reproduce

Perform axios request against a domain that does not exists with a custom `lookup`. DNS `lookup` fails with `ENOTFOUND` but `axios` then fails with `TypeError: address must be a string`

### Code snippet

```js
// simplified test:


import CacheableLookup from 'cacheable-lookup';
import axios from 'axios';

const dns = new CacheableLookup({ resolver: new Resolver({ timeout: 200 }), maxTtl: 60 * 60, lookup: false });
const controller = new AbortController();

await axios.post('https://no-such-domain-987654.com', {}, {
  signal: controller.signal,
  lookup: dns.lookup.bind(dns),
});
```

### Expected behavior

`axios` should fail with the DNS `lookup` error, not the `TypeError`

### Axios Version

1.6+

### Adapter Version

_No response_

### Browser

_No response_

### Browser Version

_No response_

### Node.js Version

_No response_

### OS

_No response_

### Additional Library Versions

_No response_

### Additional context/Screenshots

_No response_
test/unit/adapters/http.js
import path from 'path';
let server, proxy;
import AxiosError from '../../../lib/core/AxiosError.js';
import FormDataLegacy from 'form-data';
import formidable from 'formidable';
import express from 'express';
import multer from 'multer';
import bodyParser from 'body-parser';
const isBlobSupported = typeof Blob !== 'undefined';
import {Throttle} from 'stream-throttle';
import devNull from 'dev-null';
import {AbortController} from 'abortcontroller-polyfill/dist/cjs-ponyfill.js';
import {__setProxy} from "../../../lib/adapters/http.js";
import {FormData as FormDataPolyfill, Blob as BlobPolyfill, File as FilePolyfill} from 'formdata-node';
const FormDataSpecCompliant = typeof FormData !== 'undefined' ? FormData : FormDataPolyfill;
const BlobSpecCompliant = typeof Blob !== 'undefined' ? Blob : BlobPolyfill;
const FileSpecCompliant = typeof File !== 'undefined' ? File : FilePolyfill;
const __filename = url.fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
import getStream from 'get-stream';
function setTimeoutAsync(ms) {
  return new Promise(resolve=> setTimeout(resolve, ms));
}
const pipelineAsync = util.promisify(stream.pipeline);
const finishedAsync = util.promisify(stream.finished);
const gzip = util.promisify(zlib.gzip);
const deflate = util.promisify(zlib.deflate);
const deflateRaw = util.promisify(zlib.deflateRaw);
const brotliCompress = util.promisify(zlib.brotliCompress);
function toleranceRange(positive, negative) {