One core that does:
 - connection to servers
 - provides configuration facilities
 - support for loading modules
 - maintains info on who is on what channels
 - a way to register a data handler (for one large select call)

A function from a module can return :
 - CONTINUE (0)
 - STOP (1)

Outgoing data also follows this path and modules should in that case never drop the 
package.

A module should provide the following functions:
 - init()
 - loop()
 - handle_data(struct line)
 - fini()
