### Summary

* `creates` field in ansible documentation should specify `type: str` 
* `creates` field should be type checked. For example, passing a `bool` triggers vague stack trace

### Issue Type

Bug Report

### Component Name

ansible.builtin.script

### Ansible Version

```console
ansible [core 2.14.5]
  config file = None
  configured module search path = ['/home/john/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /data/john/projects/cf/env/lib/python3.10/site-packages/ansible
  ansible collection location = /home/john/.ansible/collections:/usr/share/ansible/collections
  executable location = /data/john/projects/cf/env/bin/ansible
  python version = 3.10.11 (main, Apr 20 2023, 19:02:41) [GCC 11.2.0] (/data/john/projects/cf/env/bin/python)
  jinja version = 3.1.2
  libyaml = True
```


### Configuration

```console
CONFIG_FILE() = None
```


### OS / Environment

Ubuntu

### Steps to Reproduce

<!--- Paste example playbooks or commands between quotes below -->
```yaml (paste below)
---
- name: Example Playbook
  hosts: localhost
  gather_facts: false

  tasks:
    - name: Run Script
      ansible.builtin.script:
        cmd: pwd
        chdir: "/usr/bin"
        creates: true
      register: script_output

    - name: Display script output
      debug:
        var: script_output.stdout
```


### Expected Results

Expected the module to report that `str` value should be provided instead of `bool`.

### Actual Results

```console
ansible-playbook [core 2.14.5]
  config file = None
  configured module search path = ['/home/john/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /data/john/projects/cf/env/lib/python3.10/site-packages/ansible
  ansible collection location = /home/john/.ansible/collections:/usr/share/ansible/collections
  executable location = /data/john/projects/cf/env/bin/ansible-playbook
  python version = 3.10.11 (main, Apr 20 2023, 19:02:41) [GCC 11.2.0] (/data/john/projects/cf/env/bin/python)
  jinja version = 3.1.2
  libyaml = True
No config file found; using defaults
setting up inventory plugins
host_list declined parsing /data/john/projects/cf/data/module_yaml/20230720-184644/lv3/ansible.builtin.script/hosts.ini as it did not pass its verify_file() method
script declined parsing /data/john/projects/cf/data/module_yaml/20230720-184644/lv3/ansible.builtin.script/hosts.ini as it did not pass its verify_file() method
auto declined parsing /data/john/projects/cf/data/module_yaml/20230720-184644/lv3/ansible.builtin.script/hosts.ini as it did not pass its verify_file() method
yaml declined parsing /data/john/projects/cf/data/module_yaml/20230720-184644/lv3/ansible.builtin.script/hosts.ini as it did not pass its verify_file() method
Parsed /data/john/projects/cf/data/module_yaml/20230720-184644/lv3/ansible.builtin.script/hosts.ini inventory source with ini plugin
Loading callback plugin default of type stdout, v2.0 from /data/john/projects/cf/env/lib/python3.10/site-packages/ansible/plugins/callback/default.py
Skipping callback 'default', as we already have a stdout callback.
Skipping callback 'minimal', as we already have a stdout callback.
Skipping callback 'oneline', as we already have a stdout callback.

PLAYBOOK: test.yaml ************************************************************
Positional arguments: test.yaml
verbosity: 4
connection: smart
timeout: 10
become_method: sudo
tags: ('all',)
inventory: ('/data/john/projects/cf/data/module_yaml/20230720-184644/lv3/ansible.builtin.script/hosts.ini',)
forks: 5
1 plays in test.yaml

PLAY [Example Playbook] ********************************************************

TASK [Run Script] **************************************************************
task path: /data/john/projects/cf/data/module_yaml/20230720-184644/lv3/ansible.builtin.script/test.yaml:7
<127.0.0.1> ESTABLISH LOCAL CONNECTION FOR USER: john
<127.0.0.1> EXEC /bin/sh -c 'echo ~john && sleep 0'
<127.0.0.1> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo /home/john/.ansible/tmp `"&& mkdir "` echo /home/john/.ansible/tmp/ansible-tmp-1690392695.3185742-1664374-141461953585361 `" && echo ansible-tmp-1690392695.3185742-1664374-141461953585361="` echo /home/john/.ansible/tmp/ansible-tmp-1690392695.3185742-1664374-141461953585361 `" ) && sleep 0'
<127.0.0.1> EXEC /bin/sh -c 'rm -f -r /home/john/.ansible/tmp/ansible-tmp-1690392695.3185742-1664374-141461953585361/ > /dev/null 2>&1 && sleep 0'
The full traceback is:
Traceback (most recent call last):
  File "/data/john/projects/cf/env/lib/python3.10/site-packages/ansible/executor/task_executor.py", line 158, in run
    res = self._execute()
  File "/data/john/projects/cf/env/lib/python3.10/site-packages/ansible/executor/task_executor.py", line 633, in _execute
    result = self._handler.run(task_vars=vars_copy)
  File "/data/john/projects/cf/env/lib/python3.10/site-packages/ansible/plugins/action/script.py", line 52, in run
    if self._remote_file_exists(creates):
  File "/data/john/projects/cf/env/lib/python3.10/site-packages/ansible/plugins/action/__init__.py", line 204, in _remote_file_exists
    cmd = self._connection._shell.exists(path)
  File "/data/john/projects/cf/env/lib/python3.10/site-packages/ansible/plugins/shell/__init__.py", line 138, in exists
    cmd = ['test', '-e', shlex.quote(path)]
  File "/home/john/miniconda3/envs/3.10/lib/python3.10/shlex.py", line 329, in quote
    if _find_unsafe(s) is None:
TypeError: expected string or bytes-like object
fatal: [localhost]: FAILED! => {
    "msg": "Unexpected failure during module execution: expected string or bytes-like object",
    "stdout": ""
}

PLAY RECAP *********************************************************************
localhost                  : ok=0    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0
```


### Code of Conduct

- [X] I agree to follow the Ansible Code of Conduct
description: The command executed by the task.
  returned: always
  type: list
  sample:
  - echo
  - hello
rc:
  description: The command return code (0 means success).
  returned: always
  type: int
  sample: 0
stdout_lines:
  description: The command standard output split in lines.
  returned: always
  type: list
  sample: [u'Clustering node rabbit@slave1 with rabbit@master …']
stderr_lines:
  description: The command standard error split in lines.
  returned: always
  type: list
  sample: [u'ls cannot access foo: No such file or directory', u'ls …']
'''
import datetime
import glob
import os
import shlex
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.text.converters import to_native, to_bytes, to_text
from ansible.module_utils.common.collections import is_iterable
def main():