Work towards working Directory layer implementation.

- Implemented Streams and ported over serialisation code to use them
  Streams provide a consistent interface which allows serialisation
  methods to read and write both from file descriptors representing
  sockets or files and from memory locations.
- Implemented abstractions for directory metadata, entries and list
  of entries that are all serialisable and storable in Berkeley DB.
- Implemented DirectoryDB abstraction for storing and retrieving
  directory metadata and contents in Berkley DB. Support for
  transactions touching both metadata and contents databases is
  provided via DirectoryDBTransaction.
- Added more protocol messages
    - MsgServerGroupState used to transmit information about the
      machine's server group (for example, the distribution of the
      key space among all machines).
- Updated unit tests accordingly and added new ones.
- More cleanly abstracted BDFS server state from the core server
  state.
- Changed assert(false) to use SerialisationExceptions instead.
- Added const_iterator to AssocKeySpace and thus made all write_to_fd
  methods const as they should be.
- Fixed Valgrind complaints about uninitialised memory when serialising
  messages containing padded structures.