ast: Add new dumping function with more compact output
ast: Fix bitfield sidefx removal for self-BOPs and SWAP (fixes #582)

astNewSelfBOP() has to convert
	l selfbop= r
to
	l = l normalbop r
i.e. l is cloned and thus it must handle side-effects.

In case of side-effects the old astNewSelfBOP() just did:
	tmp = @l
	*tmp = *tmp normalbop r
which however does not work if we can't take the address of l, e.g. if
it's a bitfield (as in #582).

The same problem was present in SWAP's side-effect removal code.

This patch adds a new astMakeRef() function which is the special case of
astRemSideFx() that builds a reference to the expression, allowing it to
be read and written. For easy data types, astRemSideFx() simply copies
the expression's value into a temp var, instead of building a reference.
But self-BOPs and SWAP are places where we definitely need the reference.

The new astMakeRef() has special handling for bitfields which the old
reference building code of astRemSideFx()/astNewSelfBOP()/SWAP didn't have.
It will (recursively) build a reference to the access to the bitfield's
container field, then re-add the bitfield access on top of that reference
to the container field. Since bitfield accesses can only appear on UDT
variables (i.e. only ever on things that we can take the address of), this
should always work.

Note: the specific -exx + bitfields problem from #582 was already silently
solved by 34e9a38f (Treat PTRCHK/BOUNDCHK as not having side-effects), but
it didn't fix the problem in general.