Collect results only when a result value presents

If a user calls 'done' with only a err argument, finish should not
collect the result value, because no such value exists.

However, if user calls "done(err, undefined)", then finish should
collect the "undefined" as a result.
Bug fix: replace event listeners with hand-coded listeners