Fix a recent regression in BUTFIRST where it could return a freed NODE*.
Calling gcref(arg) could inadvertantly free val if it were a list.
This change also adds some more comments and an assert around the memory
management contact of validate_argument.