(#21252) Fix problems with false/nil args and returns in lambda

The issue 21252 was triggered by a documentation error but should
have produced a different result than the error that was presented.

This was caused by a series of problems. It was not possible to
pass `false` as a parameter value as this was taken as missing parameter
value.

Also, it was not possible to return the value `false` as this was
translated to `nil` due to defective work around for missing initialized
variable on return.

The fix changes the handling of making sure that the variable that is
returned exists (by setting value explicelty to `nil` before the start
of the exception handling block.

This commit also modifies how a lambda call matches arguments to
parameters and checks what is missing (now with `false` as a valid value
in mind).

A test is added to `collect` that checks that a value of `false` can
both be passed and returned.
(#21252) Define behavior around undef and nil arguments

The behavior for an argument that was :undef (from an undefined
variable) and nil (from a function returning a nil in a data structure)
was different. This fixes that inconsistency by making them both the
same. It also clarifies that passing undef to a lambda does not result
in the default value for that parameter.

In addition some of the variables have been renamed to clarify their
purpose and extra code for a 1.8.7 difference that we were unable to
reproduce has been removed.
Merge pull request #1791 from zaphod42/issues/master/issue-21252

(#21252) Fix problems with false/nil args and returns in lambda