Bsonable graph

"basically every object in the Graph that isn't a basic datatype
(although technically we could overload those too if we wanted to go
crazy with it) has a BSONable interface with a single getBSON() method,
plus a string for its JSON tag.

getBSON() works like this - it works through each BSONable object,
calling its getBSON() method to add to either a BasicBSONObject or
BasicBSONList (depending obviously on if it's something like a list of
nodes/edges or a single property like information about a post). Then it
reads through its own data, adding things like ID numbers, sources, etc
- whatever isn't a BSONable object. Finally, it returns the constructed
BSONObject. That's it.

Then, to deserialize, you feed any object a BSONObject. In the object's
constructor, you retrieve the entries that matter to that object - if it
fails, it only fails for that object, and you have the specific
BSONObject it used available telling you why. But what's really
beautiful (I think) is that it uses BSONObjects to build most of its
entries - that is, you call 'new PostInfo(BSON.get(PostInfo.JSONTag))',
and PostInfo is built from a BSONObject stored in what the node has
received. It's also easy to send partial information back and forth
about an object - just leave it out of the BSONObject you're building
(using a seperate method than getBSON obviously, maybe getBSONEdges()
for instance) and methods in the exact same class that merge them into
an existing object. And if you wanted to add something weird down the
line like a PostInfo to an edge, all you'd need to do is add it as a
field, modify that method, and add it to the BSON-based constructor."