per-callback user data

otherwise, all signal handlers will share the same
data, and the last installed signal handlers will
overwrite all the previous.

Until now it has worked flawlessly because all signal
handlers actually shared the same data (eloop)
refector signal handler add/del