This is a minimal failing example:
    
    // ==UserScript==
    // @name           Test
    // @namespace      .
    // @description    Test userscript.
    // @require        http://code.jquery.com/jquery-1.7.1.min.js
    // @require        http://josh.gitlin.name/userscripts/ThirdPlace.js
    // @include        http://chat.stackexchange.com/rooms/*
    // ==/UserScript==

    /*
     * Injects functions into the page so they can freely interact with existing code
     * Taken from http://stackapps.com/q/2171/10127
     */
    function inject() {
      for (var i = 0; i < arguments.length; ++i) {
        if (typeof(arguments[i]) == 'function') {
          var script = document.createElement('script');
          script.type = 'text/javascript';
          script.textContent = '(' + arguments[i].toString() + ')(jQuery)';
          document.body.appendChild(script);
        }
      }
    }
    
    inject(function($) {
      alert('inject');
      ThirdPlace.observe('newMessage',function(event) {
        alert(event);
      });
  
      ThirdPlace.observe('editMessage',function(event) {
        alert(event);
      });
    });

The alert with `inject` is executed (when entering chat), the others are nor (when message events happen).
  
This is the error I get (repeatedly) when reloading the chat and when new messages come in:

    Error: console.log.apply is not a function
    Source File: resource://greasemonkey/runScript.js
    Line: 410

Without

    // @require        http://code.jquery.com/jquery-1.7.1.min.js
I get

    Error: $ is not defined
    Source File: file://.../ThirdPlace.js
    Line: 587

I run Firefox 10.0.1

*Follow-up questions:*

 * Is there an event that is triggered after entering a room when all messages have been loaded? Or is a `newMessage` event triggered for all shown messages?
 * Do message events contain the corresponding DOM element, i.e. the `div.message` or `div.content` nodes?