Use proxy events in place of native events

Trying to use native events conditionally is a minefield of strange
behavior; always proxy to a custom event to allow full control over all
events.
Call `preventDefault` when a proxied native event is prevented
Localize event configuration to one file and put in hooks

Allow events to define a "setup" method that is run when at least one
listener is bound to an event of the given type, and a "data" method to
allow passing in custom data along with the event.
Call event listeners with the event `detail` as the second arg

This will be useful for custom events that have a `data` property
defined to pass useful data to event listeners.
Include data about what actually changed with "change" event