add user_data in esl_listen so the main function can pass a private user_data to callback