Like most things proprietary, OpenSource people have written their own InstantMessenger, called Jabber. Jabber is built on a robust model, similar to SMTP and HTTP, and completely unlike IRC's unscalable mess. It is based on a core router which speaks XML with small plugin modules handling all the various parts of the InstantMessaging.
The contact list is called the roster. Adding people to the roster is called subscribing to their presence. Subscriptions can be both ways (you can see them and they can see you) or only one way, but unlike most other IM clients, Jabber also lets you know when people have you on their roster: this appears as a subscription from them, not to them. People can be added to your roster either by their Jabber ID or by searching for them in the Jabber Users' Directory.
Jabber has support for people logging in multiple times on a single account by way of adding a resource name to the account to distinguish the logins: firstname.lastname@example.org/Foo and email@example.com/Bar is the same user, but under different logins. Messages can be sent to a specific resource or without specifying a resource. In the latter case, the message is delivered to whichever resource has the highest priority (which can be set at log in time). Priorities of 0 don't get messages sent to them. IF you send a message to a /resource that isn't online, it'll be delivered as if it was sent to the bare JID.
The Jabber server will store messages for later delivery if the recipient is not online at the time.
JabberTransport modules can be loaded into a Jabber to enable communication using other InstantMessaging protocols, such as AOL, MSN, etc. You give your login details for that network to the server, and it acts as a Proxy.