I think this is the appropriate first approach. However, after we get it working, my preference is to expose LLVM instructions like `trunc`, `zext`, `sext`, `fptrunc` etc. directly, and then build higher order logic like casting on top of that.