ENH: allow schema to be a dict in to_parquet
#### Is your feature request related to a problem?

I come from writing parquet with dask (https://docs.dask.org/en/latest/generated/dask.dataframe.to_parquet.html).
In `dask.dataframe.to_parquet` schema can be a Schema object, dict, "infer" or None.
I'm used to passing a dict with pyarrow schema definition e.g. `{"a": pa.int32(), "b": pa.string(), "c": pa.float32()}` to the schema arg.
Passing a dict to the schema arg in `to_parquet` gives `TypeError: Argument 'schema' has incorrect type (expected pyarrow.lib.Schema, got dict)`

#### Describe the solution you'd like

```
if isinstance(schema, dict) and engine == "pyarrow":
    schema = pa.schema(schema)
```
https://github.com/dask/dask/blob/main/dask/dataframe/io/parquet/arrow.py#L789

#### API breaking implications

None (I don't believe)

#### Additional context

```python
import pandas as pd
import pyarrow as pa

df = pd.DataFrame([1, "a", 1.5], index=list("abc")).T
d = {"a": pa.int32(), "b": pa.string(), "c": pa.float32()}

df.to_parquet("tmp.parquet", schema=d)
TypeError                                 Traceback (most recent call last)
/tmp/ipykernel_50490/2662220410.py in <module>
----> 1 df.to_parquet("/tmp/tmp2.parquet", schema=d)

/opt/userenvs/ray.bell/ml_env/lib/python3.8/site-packages/pandas/util/_decorators.py in wrapper(*args, **kwargs)
    205                 else:
    206                     kwargs[new_arg_name] = new_arg_value
--> 207             return func(*args, **kwargs)
    208 
    209         return cast(F, wrapper)

/opt/userenvs/ray.bell/ml_env/lib/python3.8/site-packages/pandas/core/frame.py in to_parquet(self, path, engine, compression, index, partition_cols, storage_options, **kwargs)
   2675         from pandas.io.parquet import to_parquet
   2676 
-> 2677         return to_parquet(
   2678             self,
   2679             path,

/opt/userenvs/ray.bell/ml_env/lib/python3.8/site-packages/pandas/io/parquet.py in to_parquet(df, path, engine, compression, index, storage_options, partition_cols, **kwargs)
    414     path_or_buf: FilePathOrBuffer = io.BytesIO() if path is None else path
    415 
--> 416     impl.write(
    417         df,
    418         path_or_buf,

/opt/userenvs/ray.bell/ml_env/lib/python3.8/site-packages/pandas/io/parquet.py in write(self, df, path, compression, index, storage_options, partition_cols, **kwargs)
    171             from_pandas_kwargs["preserve_index"] = index
    172 
--> 173         table = self.api.Table.from_pandas(df, **from_pandas_kwargs)
    174 
    175         path_or_handle, handles, kwargs["filesystem"] = _get_path_or_handle(

TypeError: Argument 'schema' has incorrect type (expected pyarrow.lib.Schema, got dict)

schema = pa.schema(d)
df.to_parquet("tmp.parquet", schema=schema)
```
