Document `output_types_preference` in ScalarOp
Description
ScalarOps are parametrized by an output_types_preference that determines the output types from the input types in make_node (unless an Op overrides make_node). This is used indirectly via output_types. The design is somewhat convoluted, but meant to make it easier to define ScalarOps (and IIRC to tweak their behavior in the InplaceOptimizer).
The whole logic should be documented, in which process, we may find out it can be simplified. Also, everytime we use it we check whether the outputs from this function are valid, which is costly. Since nobody is really creating new output_types_preference we should just trust them.
https://github.com/pymc-devs/pytensor/blob/ee107cbafd7257d52d9877dbb2c9b07477680392/pytensor/scalar/basic.py#L1219-L1272