What I would prefer is a set of protocols that are interact in a well defined way with each others, like the Email or Usenet protocols, then you can write different clients for these and decentralisation is just a matter of running different servers clients that don't necessarily interact with each other. Something like the CapeProto RPC framework makes it relatively easy to declare the interface of a service.