Well to avoid a server to "matchmake" you could do what skype does and set up some peers as relays to others behind NATs. You wll always need some sort of boot strapping mechanism, so a centralized server will probably play into your system somehow (depending on what your developing, of course).