Using GPU type with Standard Ops

I would love to see more opening up of the MLIR type system, which I think we are now in a position to do with type interfaces. The current state means that many of the operations in the std dialect have to be duplicated all over the place to operate on other shaped types (that can’t truly be ShapedType because it’s a closed class hierarchy). Right now, standard ops only operate on (a subset of) builtin types, but perhaps we could consider turning ShapedType into an interface (I think there was a previous discussion about this, but I can’t find it) and making them operate on that. This would likely require a larger conversation and an RFC though. It has other benefits as well, like letting ops on types from other dialects hook into the verification provided for builtin types. Right now adding verification for these is a pain and a significant disincentive leading to either under-verifying or overloading standard types (at some point in IREE’s past we overloaded memref because defining our own type would have come with some much overhead to retain feature parity)