BSER: a binary serialization format

Summary:
Add a binary serialization format.  This inserts fairly cleanly into our handling:

 * Format can represent all JSON types implemented in our library
 * Strings are no longer spec'd as being UTF-8; they're binary
 * The CLI defaults to bser for client<->server communication and JSON for output
 * CLI options to select output and server encoding formats
 * The server responds in the same format as the request it received

The binary format describes its own length which allows clients to know ahead of
time how much memory they'll need and avoid realloc.  Each data item is a copy
of its binary representation on the server, except for integer types which are
encoded using the smallest possible representation for the value at hand.  This
allows for a degree of compression compared to textual JSON and is much simpler
to decode than translating string representations of numbers back and forth.

Integers are presented in host byte order since communication is always local;
it makes no sense to byteswap from LE to BE and back again.

Further compression is realized by changing the JSON library API to
define "template" objects with properties that are known at the start of
array processing; this allows the property names to be factored out of
the object value stream and allows saving approximately 50% of the space
vs. compact JSON.

A python `bser` extension is included that supports `dumps` and `loads`;
you can exercise the extension using:

```
cd python/bser
./setup.py build
PYTHONPATH=build/lib.linux-x86_64-2.6 ./tests.py
```

Reviewers: sid0

Reviewed By: sid0

CC: security-diffs@lists, bryano

Differential Revision: https://phabricator.fb.com/D809287

Task ID: 2339174