Rust changes for v6.6

In terms of lines, most changes this time are on the pinned-init API
and infrastructure. While we have a Rust version upgrade, and thus a
bunch of changes from the vendored 'alloc' crate as usual, this time
those do not account for many lines.

Toolchain and infrastructure:

 - Upgrade to Rust 1.71.1. This is the second such upgrade, which is a
   smaller jump compared to the last time.

   This version allows us to remove the '__rust_*' allocator functions
   -- the compiler now generates them as expected, thus now our
   'KernelAllocator' is used.

   It also introduces the 'offset_of!' macro in the standard library
   (as an unstable feature) which we will need soon. So far, we were
   using a declarative macro as a prerequisite in some not-yet-landed
   patch series, which did not support sub-fields (i.e. nested structs):

       #[repr(C)]
       struct S {
           a: u16,
           b: (u8, u8),
       }

       assert_eq!(offset_of!(S, b.1), 3);

 - Upgrade to bindgen 0.65.1. This is the first time we upgrade its
   version.

   Given it is a fairly big jump, it comes with a fair number of
   improvements/changes that affect us, such as a fix needed to support
   LLVM 16 as well as proper support for '__noreturn' C functions, which
   are now mapped to return the '!' type in Rust:

       void __noreturn f(void); // C
       pub fn f() -> !;         // Rust

 - 'scripts/rust_is_available.sh' improvements and fixes.

   This series takes care of all the issues known so far and adds a few
   new checks to cover for even more cases, plus adds some more help
   texts. All this together will hopefully make problematic setups
   easier to identify and to be solved by users building the kernel.

   In addition, it adds a test suite which covers all branches of the
   shell script, as well as tests for the issues found so far.

 - Support rust-analyzer for out-of-tree modules too.

 - Give 'cfg's to rust-analyzer for the 'core' and 'alloc' crates.

 - Drop 'scripts/is_rust_module.sh' since it is not needed anymore.

Macros crate:

 - New 'paste!' proc macro.

   This macro is a more flexible version of 'concat_idents!': it allows
   the resulting identifier to be used to declare new items and it
   allows to transform the identifiers before concatenating them, e.g.

       let x_1 = 42;
       paste!(let [<x _2>] = [<x _1>];);
       assert!(x_1 == x_2);

   The macro is then used for several of the pinned-init API changes in
   this pull.

Pinned-init API:

 - Make '#[pin_data]' compatible with conditional compilation of fields,
   allowing to write code like:

       #[pin_data]
       pub struct Foo {
           #[cfg(CONFIG_BAR)]
           a: Bar,
           #[cfg(not(CONFIG_BAR))]
           a: Baz,
       }

 - New '#[derive(Zeroable)]' proc macro for the 'Zeroable' trait, which
   allows 'unsafe' implementations for structs where every field
   implements the 'Zeroable' trait, e.g.:

       #[derive(Zeroable)]
       pub struct DriverData {
           id: i64,
           buf_ptr: *mut u8,
           len: usize,
       }

 - Add '..Zeroable::zeroed()' syntax to the 'pin_init!'  macro for
   zeroing all other fields, e.g.:

       pin_init!(Buf {
           buf: [1; 64],
           ..Zeroable::zeroed()
       });

 - New '{,pin_}init_array_from_fn()' functions to create array
   initializers given a generator function, e.g.:

       let b: Box<[usize; 1_000]> = Box::init::<Error>(
           init_array_from_fn(|i| i)
       ).unwrap();

       assert_eq!(b.len(), 1_000);
       assert_eq!(b[123], 123);

 - New '{,pin_}chain' methods for '{,Pin}Init<T, E>' that allow to
   execute a closure on the value directly after initialization, e.g.:

       let foo = init!(Foo {
           buf <- init::zeroed()
       }).chain(|foo| {
           foo.setup();
           Ok(())
       });

 - Support arbitrary paths in init macros, instead of just identifiers
   and generic types.

 - Implement the 'Zeroable' trait for the 'UnsafeCell<T>' and
   'Opaque<T>' types.

 - Make initializer values inaccessible after initialization.

 - Make guards in the init macros hygienic.

'allocator' module:

 - Use 'krealloc_aligned()' in 'KernelAllocator::alloc' preventing
   misaligned allocations when the Rust 1.71.1 upgrade is applied later
   in this pull.

   The equivalent fix for the previous compiler version (where
   'KernelAllocator' is not yet used) was merged into 6.5 already,
   which added the 'krealloc_aligned()' function used here.

 - Implement 'KernelAllocator::{realloc, alloc_zeroed}' for performance,
   using 'krealloc_aligned()' too, which forwards the call to the C API.

'types' module:

 - Make 'Opaque' be '!Unpin', removing the need to add a 'PhantomPinned'
   field to Rust structs that contain C structs which must not be moved.

 - Make 'Opaque' use 'UnsafeCell' as the outer type, rather than inner.

Documentation:

 - Suggest obtaining the source code of the Rust's 'core' library using
   the tarball instead of the repository.

MAINTAINERS:

 - Andreas and Alice, from Samsung and Google respectively, are joining
   as reviewers of the "RUST" entry.

As well as a few other minor changes and cleanups.