The only thing you need to do is block the URL:
facebook.com/ajax/mercury/change_read_status.php
For Chrome, use the extension "FB unseen" which blocks the URL (full disclosure: I wrote this extension). If you want you can use any adblocker to achieve this. But with "FB unseen" you can "Mark as read" whatever you want, so you can decide for yourself when the "Seen" flag is set.
One drawback of this extension is that all your messages will be marked as unread for yourself, too, and the "unread messages" notification stays visible as long as you do not reply (or explicitly mark it as read).
Update: Facebook requested me to take the extension down since it violates their Terms of Services. Since it was developed open source and the source is available at GitHub, I updated the link to point to the GitHub Page. To not risk any more trouble with Facebook, I will not provide an instruction on how to install extensions manually and will also not continue developing it. The extension was previously available at https://chrome.google.com/webstore/detail/ihcedcpmfdpjijiamkaeaefgfagnnpei, you can find a couple of alternatives in the store by searching for them.