add an event backend where a thread is dedicated to waiting on epoll and handing off wakeups. this is a proof of concept, not meant to be performant