User:T. Canens/strict aliasing rewrite

This is a rewrite of cpp/language/reinterpret cast, per discussion on that talk page. It simplifies the presentation of the rule following Richard Smith's analysis in c++std-core-26491.

Type aliasing
Whenever an attempt is made to read or modify the stored value of an object of type through a glvalue of type, the behavior is undefined unless one of the following is true:
 * and are similar.
 * is the (possibly -qualified) signed or unsigned variant of.
 * is, or : this permits examination of the  of any object as an array of bytes.

Informally, two types are similar if, after stripping away cv-qualifications at every level (but excluding anything inside a function type), they are the same type. For example:
 * and are similar;
 * and are similar;
 * and are similar;
 * and are not similar;
 * and are not similar;
 * and are not similar;
 * and are similar (they are the same type).

This rule enables type-based alias analysis, in which a compiler assumes that the value of an object of type X is not modified by an write to a glvalue of a different type (subject to the exceptions noted above).