The definition of MIR is in rustc::mir. The conversion to LLVM IR happens in what has been known rustc_trans for many years, though it will soon be renamed rustc_codegen_llvm or something like that, reflecting that it’s becoming one of multiple backends.
Speaking of which, rustc is in the process of being reorganized to more easily support multiple backends, but it’s not done yet. These changes will be required for a high-quality GCC backend (or any non-LLVM backend) so for the time being you may notice various important bits (e.g., layout computation, until https://github.com/rust-lang/rust/issues/45226 is fixed) being in LLVM-specific code. I hope it’s far enough along that you won’t be outright blocked from compiling non-trivial code.
Some aspects are currently in flux, but mostly in areas that don’t concern backends (more related to analyses like borrow checking). However, MIR is 110% an implementation detail of rustc, so it’s certainly possible for any part of it to change at a moment’s notice.
This would be extremely controversial to say the least. It doesn’t help that (AFAIK) nobody has described a good use case for this. Using a textual form does not provide any more stability than using the rustc libraries. Furthermore, MIR is not standalone – most importantly, it reuses the entire trait and type system of Rust but does not have facilities for defining types and traits.
If your intent is to be able to work with MIR without rebuilding rustc every time you change something, note that there’s a better solution for that: link to the rustc libraries to build a custom driver, like miri or rlsl.
I highly recommend joining the #rustc IRC channel and asking questions. I’ve learned a lot just from lurking there and occasionally asking for clarifications. While I can’t commit to full on mentoring, I’m more than happy to answer questions when I’m around, and in my experience the other folks in there are as well 