Rework internal RB macros to avoid assignments via type punned pointers.
RB uses low order pointer bits to encode information (whether children
are red), and was manipulating those values via (*(__uintptr_t *)&elm),
which leads to strict aliasing warnings.
In the kernel we use -fno-strict-aliasing, but this isn't necessarily
the case in user space. This quiets thousands of -Wstrict-aliasing
warnings in the user space build.
Reported by: GCC -Wstrict-aliasing