Headers should allow subclasses of str or bytes

<!-- Summary. -->

https://github.com/foyoux/aligo/issues/55

```py
from dataclasses import dataclass

import requests


@dataclass
class ShareToken(str):
    """
    >>> assert isinstance(ShareToken('xxx'), str)
    """
    share_token: str = None
    expire_time: str = None
    expires_in: int = None

    def __new__(cls, *args, **kwargs):
        share_token = kwargs.get('share_token')
        if share_token is None:
            share_token = args[0]
        return super().__new__(cls, share_token)

    def __str__(self):
        return self.share_token


def main():
    share_token = ShareToken('xxx')
    resp = requests.get('https://github.com/', headers={
        # Why am I doing this?
        # Because the share_token has a short validity period,
        # but the program may need it for a long time,
        # the object used is convenient for updating in place when it fails.
        # Maybe I didn't express clearly,
        # but as far as my own application scenario is concerned,
        # this is the best way. Of course, these are not the point,
        # the point is that I think headers should allow subclasses of str or bytes. thanks
        'x-share-token': share_token
    })
    print(resp.status_code)


if __name__ == '__main__':
    main()
```

## Expected Result

<!-- What you expected. -->
The operation is successful, no error is reported, and 200 is printed out.



## Actual Result

<!-- What happened instead. -->
It is OK under requests==2.27.1, but the latest 2.28.0 & 2.28.1 reports an error "requests.exceptions.InvalidHeader: Header part (...."

```shell
Traceback (most recent call last):
  File "/home/foyou/Desktop/projects/foyoux/aligo/main.py", line 42, in <module>
    main()
  File "/home/foyou/Desktop/projects/foyoux/aligo/main.py", line 27, in main
    resp = requests.get('https://github.com/', headers={
  File "/home/foyou/Desktop/projects/foyoux/aligo/venv/lib/python3.10/site-packages/requests/api.py", line 73, in get
    return request("get", url, params=params, **kwargs)
  File "/home/foyou/Desktop/projects/foyoux/aligo/venv/lib/python3.10/site-packages/requests/api.py", line 59, in request
    return session.request(method=method, url=url, **kwargs)
  File "/home/foyou/Desktop/projects/foyoux/aligo/venv/lib/python3.10/site-packages/requests/sessions.py", line 573, in request
    prep = self.prepare_request(req)
  File "/home/foyou/Desktop/projects/foyoux/aligo/venv/lib/python3.10/site-packages/requests/sessions.py", line 484, in prepare_request
    p.prepare(
  File "/home/foyou/Desktop/projects/foyoux/aligo/venv/lib/python3.10/site-packages/requests/models.py", line 369, in prepare
    self.prepare_headers(headers)
  File "/home/foyou/Desktop/projects/foyoux/aligo/venv/lib/python3.10/site-packages/requests/models.py", line 491, in prepare_headers
    check_header_validity(header)
  File "/home/foyou/Desktop/projects/foyoux/aligo/venv/lib/python3.10/site-packages/requests/utils.py", line 1037, in check_header_validity
    raise InvalidHeader(
requests.exceptions.InvalidHeader: Header part (ShareToken(share_token='xxx', expire_time=None, expires_in=None)) from {'x-share-token': ShareToken(share_token='xxx', expire_time=None, expires_in=None)} must be of type str or bytes, not <class '__main__.ShareToken'>
```

## Reproduction Steps

run this code

```python

from dataclasses import dataclass

import requests


@dataclass
class ShareToken(str):
    """
    >>> assert isinstance(ShareToken('xxx'), str)
    """
    share_token: str = None
    expire_time: str = None
    expires_in: int = None

    def __new__(cls, *args, **kwargs):
        share_token = kwargs.get('share_token')
        if share_token is None:
            share_token = args[0]
        return super().__new__(cls, share_token)

    def __str__(self):
        return self.share_token


def main():
    share_token = ShareToken('xxx')
    resp = requests.get('https://github.com/', headers={
        # Why am I doing this?
        # Because the share_token has a short validity period,
        # but the program may need it for a long time,
        # the object used is convenient for updating in place when it fails.
        # Maybe I didn't express clearly,
        # but as far as my own application scenario is concerned,
        # this is the best way. Of course, these are not the point,
        # the point is that I think headers should allow subclasses of str or bytes. thanks
        'x-share-token': share_token
    })
    print(resp.status_code)


if __name__ == '__main__':
    main()
```

## System Information

    $ python -m requests.help

```json
{
  "chardet": {
    "version": null
  },
  "charset_normalizer": {
    "version": "2.0.12"
  },
  "cryptography": {
    "version": ""
  },
  "idna": {
    "version": "3.3"
  },
  "implementation": {
    "name": "CPython",
    "version": "3.10.5"
  },
  "platform": {
    "release": "5.14.0-1051-oem",
    "system": "Linux"
  },
  "pyOpenSSL": {
    "openssl_version": "",
    "version": null
  },
  "requests": {
    "version": "2.28.1"
  },
  "system_ssl": {
    "version": "1010106f"
  },
  "urllib3": {
    "version": "1.26.12"
  },
  "using_charset_normalizer": true,
  "using_pyopenssl": false
}
```

<!-- This command is only available on Requests v2.16.4 and greater. Otherwise,
please provide some basic information about your system (Python version,
operating system, &c). -->


@nateprewitt :rose: 

Duplicate #6159