My understanding is that these are supposed to be fairly light weight classes. I think resources are trivial most of the time, but events may need to own their data.
The type erasure is currently implemented with inheritance and shared_ptr. Does it make sense to use std::variant when we move to c++17?