ast: Allow astTypeIniFlush() against expressions, not just symbols

This fixes a FIXME in astNewASSIGN().

Besides astTypeIniFlush() itself, also cInitializer() and the
astTypeIniAdd*() functions had to be adjusted to preserve the proper dtype,
which allowed the AST_INIOPT_DODEREF/FB_INIOPT_DODEREF hack used by NEW
operator handling to be removed.
cInitializer(): Don't build TYPEINI_SCOPEINI without corresponding SCOPEEND

This one code path could build a TYPEINI tree with a SCOPEINI, then an
ASSIGN to the UDT (not a field), and then no SCOPEEND.

A SCOPEINI without SCOPEEND would break the C/LLVM backends. But this never
caused any problems because this code path only covers UDT initializers
where the UDT doesn't have a constructor, which are currently only
allowed for local variables, and those will be flushed with
astTypeIniFlush() instead of astLoadStaticInitializer(), and that doesn't
use SCOPEINI/SCOPEEND at all. It's only astLoadStaticInitializer() that
uses them for the C/LLVM backends.

As it turns out, it makes most sense to not build a TYPEINI scope at all
on this code path. But since it's unknown at the beginning whether a scope
will be needed or not, the SCOPEINI must always be added, and then removed
again if it's not needed.
ast: Only use typeDump() in debug build