addDirectEventListener just inserts a check if(e.target !is this) return; meaning it opts out
of participating in handler delegation.
Use scope on your handlers when you can. While it currently does nothing, this will future-proof your code against future optimizations I want to do. Instead of copying whole event objects out if you do need to store them, just copy the properties you need.
Events use a Javascript-esque model. See more details on the Event page.
addEventListener returns an opaque handle that you can later pass to removeEventListener.
addDirectEventListener just inserts a check if(e.target !is this) return; meaning it opts out of participating in handler delegation.