Change the conversion materialization hook in TypeConverter to support the materialization of 1-1 conversions. Instead of having the hook as a virtual function, keep it as a callback, (1) it would compose better with different type conversion extensions and (2) this makes the hook optional. Change the hook signature to return Value instead of operation, allowing it to return the original value unmodified when no materialization is necessary for 1-1 conversion.
This diff also includes the changes to the LLVM and GPU dialect conversion to illustrate how this new support makes them simpler.
Do we forsee instances where we may want multiple materializers registered? I want to move TypeConverter closer to how ConversionTarget works and allow for it to be more easily extended. I can imagine a situation where we may want to materialize differently depending on the type.