A simplified explanation...
Model:
Your model class mainly handles fetching of data; usually from the database. So this is where all your hand crafted SELECT queries would be placed. Performing an sql query from anywhere else (for example, from a controller class or heaven forbid, a view class) is a bad idea.
DataWriter:
As the name suggests, a DW is responsible for manipulating data. ie, it would handle insertion, updation and deletion of data from the database. One thing you'd notice is a datawriter handles one row at a time. So unlike your Model from which you can select a bunch of rows in one go; a datawriter can manipulate a single row of data, only.
Using a datawriter to manipulate data has an added benefit of maintaining integrity of your data.
Event Listeners:
Whenever you set up a code event listener via the Admin Panel, you have to specify a "callback" method which would be executed when your selected event occurs. This callback method can be placed in ANY class of your choice. Most devs choose to place these methods in a "Listener.php" file, to make it obvious to the reader. But it's not a requirement. I place such methods in an "Addon.php" file, along with the installer code, as I find it easier to manage that way.