Extracting base event "types" into interfaces

`BlockEvents` interface may be combined with any other event interface
rather than limiting child classes to being of one type.

For convenience, a base abstract class remains, so that simple events
don't need to repeat code.

Based on the discussion for 63b4ed2c