freshToFreeAvoiding s t converts all fresh variables in the range of
s to free variables avoiding free variables in t. This function tries
to reuse variable names from the domain of the substitution if possible.

freshToFreeAvoidingFast s t converts all fresh variables in the range of
s to free variables avoiding free variables in t. This function does
not try to reuse variable names from the domain of the substitution.

General Substitutions

We use the data type SubstVFresh c v of substitutions.
c denotes the type of constants and v the type of variables.
Fresh substitutions cannot be applied directly, they have to be converted
to free substitutions in a certain context (MonadFresh).