Similar to the `Unitary` trait, we can also have a `Hermitian` trait, which signifies that `adjoint(op) == op`. We should also add a canonicalization rewrite pass that propagates this information through containers: * `adjoint(Hermitian) -> Hermitian` * `rot(Hermitian) -> Unitary` * ...