Handle decls / flow statements before their sub-statements

This fixes things like giving decls symbols in for-initialisers.
Skip casts when logging about unused experssions
Only warn the first time for unused expressions
Fix scope nesting - set before we descend into the code
Fix tracking of decayed arrays - different types

int [] -> int * is treated as a different type to plain int *, so
we can detect its .decayed property.
type_loc() uses a fallback
Maintain type location across type decay
test __typeof() in a parameter
fold() a struct/union/enum after creation
Fix showing decayed pointers - only show exact pointer types