Extend QDQPropagation transformer to handle multiple consumers (#21313)
### Description
- Extends the QDQPropagationTransformer to propagate DQs (forward)
across operators with multiple consumers (previously only supported 1
consumer).
- Adds Slice to the list of operators that the QDQPropagationTransformer
can propagate DQ/Q ops across.
- Supports QDQ propagation for opset 21.
- Correctly copies Q or DQ attributes when creating new nodes.
### Motivation and Context
The QDQPropagationTransformer fixes up QDQ node units for certain "data
movement" ops (e.g., Transpose) by inserting Q -> DQ sequences where
necessary. For example, the sequence `DQ -> Transpose -> Sigmoid` is
transformed to `DQ -> Transpose -> Q -> DQ -> Sigmoid`.
However, this fix-up does not currently support data movement ops with
multiple consumers, as in:
```
DQ -> Transpose --+--> Sigmoid ->
|
+--> Relu ->
|
+-> graph_output
```
With the updates in this PR, the above model can be transformed to:
```
DQ -> Transpose -> Q --+--> DQ -> Sigmoid ->
|
+--> DQ -> Relu ->
|
+--> DQ -> graph_output
```
This update allows QNN EP to support quantized models created with tools
that do not wrap data movement ops in Q/DQ ops.
---------
Co-authored-by: Edward Chen <18449977+edgchen1@users.noreply.github.com>