throw+: allow an explicitly specified cause to be nil

and more thorough tests for all the possible cases of throw+ args