remove intermediate variables at the place of their origin

This is the right place to do it. Otherwise, they may show up in residual
goals. This also lets us shorten unsatisfiable_conjunction/2.
add BDD validation
this can now be made unconditional.

The reason this needed to be conditional was that existential counter
variables (introduced by card()) were able to refer to the (already
processed) root although they were no longer part of the BDD at all,
and they could appear in residuals because their nodes were still
reachable by the local association list of some variable. We now
remove the attributes of all existential counter variables at the
place of their origin, so they can no longer appear in residuals.
reorder a few predicates and comments for better readability