ast: Fix astSetType() vs. TYPEINI assert()
iif(): Call astTypeIniUpdate() for true/false and fix up temp dtor calls

astTypeIniUpdate() can allocate temp vars, thus it's important that iif()
calls it for the true/false expressions. Any temp var from the true/false
expressions must only appear on the true/false code paths.

Otherwise, the astTypeIniUpdate() from astAdd() would allocate the temp
vars, causing them to be constructed before the whole statement, and
destructed at the end of the whole statement -- not just before/after the
true/false code paths respectively.
iif(): Fix bad temp var dtor calls for ctorcalls in true/false expressions

Similar to the previous commit -- astBuildImplicitCtorCallEx() may build
a CALL whose ARGs can create temp vars (e.g. when passing an integer
constant to a BYREF param). Thus astDtorListScopeBegin/End() calls are
needed around any code that can modify the true/false expressions...
ast: Delete dtor list entries when deleting an expression

This fixes the same issue seen in b5129f76, only in a more generic way,
so the issue is not only fixed for sizeof/typeof, but also for other cases
where expressions will be deleted by the compiler, for example the UDT
expression used in static member accesses (since it's a static member,
the instance expression isn't needed).
astBuildBranch(): Call astTypeIniUpdate() for the condition expression

Same problem as in 88a63962
astBuildBranch(): Optimize branch also if it's nested in LINKs

(which can happen e.g. due to the astTypeIniUpdate() added in the previous
commit)