rewrite rustup to support caching nightlies, protects against truncation errors

This closes #19168.

Please be careful reviewing this since this gets used all over the place. I've tested all the options and everything appears to be working though.
I think we should still default to downloading from `rust-nightly-...` because we're not always guaranteed to have nightlies for each date (they could fail to sync).