Base type of all structure information.
StructInfo stores possible structure information deduced during compile-time. It encapsulates both static type and runtime information such as shape.
StructInfo of each non-primitive Expr can be deduced during compilation in a "best-effort" manner.
When struct_info appears in function parameter and return signatures. They will imply a runtime check that matches the structure information with the value.
When it appears in Expr, they follow "assume-semantics", which means the compiler will take the deduced information as it is and only do best effort prove and checks.
Each struct info can be uniquely erased to a static-type. The compiler will still compile the code(with less information) when we erase to the static type.
If an StructInfo contains an Expr field, then that field must be normalized already through NormalizeArg. This invariant will be checked in constructors and help us to simplify our assumption during struct info deduction.