ddc-core-simpl: Forward: only forward atomic bindings, if they're still atomic after forwarding

Always float atomic bindings (variables, constructors),
but only if they're still atomic after forwarding them:
if x1 is a variable to be replaced with a function, then
substituting x1 into x2 could duplicate that.
update tests after modifying Forward
ddc-core-simpl: Forward: handle shadow bindings

forward had an error where shadowing bindings could, in some cases, take
the shadowed values:

let x = floatable (\a -> b)     in
let x = something complex       in
    x

here, the occurrence of the second x shouldn't be forwarded, but the first x was in the
binding map, so was being replaced by value of the first x.
ddc-core-flow: hack for type sums: just return bottom :: Data
ddc-core-flow: to-tetra: a-normalise before converting

a-normalise before converting, because the conversion can actually
duplicate occurrences of case scrutinees, and other arguments.
a-normalisation beforehand will assure that these arguments to
primitives and the scrutinees will just be variables, so no duplication
of work is possible.

this a-normalisation was being done before, but floating was done
afterwards, which could somewhat undo this.
instead, the floating is now deferred until afterwards.