DJabberd::Cluster
     void    ->send_message($barejid, $cluster_message)
              - most important
              (has a default implementation that connects directly to everybody found in star topology)

  (abstract) @locations = ->find_barejid_locations($barejid)
                  void    ->send_message($barejid, $cluster_message)
                     (has a default implementation that connects directly, star topology)

   DJabberd::Cluster::Naive
           find_barejid_locations doing polling the star
           or just send the message to all peers!

   DJabberd::Cluster::LiveJournal
         - override find_barejid_locations w/ database lookup (in subprocess/gearman)
         - keep default start topology delivery

   DJabberd::Cluster::Spread
         - probably only does send_message, with $barejid being the message group


DJabberd::ClusterMessage  (IQ-style tagged message/response)
  -- must serialize itself to/from storable and Cluster's transport can choose to encode atop that.

  DJabberd::ClusterMessage::RosterPush       response = OK
  DJabberd::ClusterMessage::BareJIDLookup    response = @locations
  DJabberd::ClusterMessage::StanzaDelivery   response = OK


CREATE TABLE jidmap (
    barejid   VARCHAR,
    resource  VARCHAR,
    PRIMARY KEY (barejid, resource),
    server    VARCHAR
);

# when logging off,
delete from jidmap where bare=..., res=..., and server=....;  (delete all 3 fields)

# when logging on,
REPLACE INTO jidmap (..., ..., ...)  (insert all three, blowing away)

