Use done callbacks instead of events for final/error

@redonkulus @lingyan