*document* ::= int32 e_list "\x00"  size, elements and trailing \0

*e_list*   ::= *element* e_list     
           |     ""     

*element*  ::= "\x01" e_name double           64-bit binary floating point
           | "\x02" e_name string           UTF-8 string
           | "\x03" e_name *document*         Embedded document
           | "\x04" e_name *document*         Array
           | "\x05" e_name binary           Binary data
           | "\x07" e_name (byte*12)        ObjectId
           | "\x08" e_name "\x00"           Boolean "false"
           | "\x08" e_name "\x01"           Boolean "true"
           | "\x09" e_name int64            UTC datetime
           | "\x0A" e_name                  Null value
           | "\x0B" e_name cstring cstring  Regular expression: pattern, options
           | "\x0D" e_name string           JavaScript code
           | "\x0F" e_name code_w_s         JavaScript code w/ scope
           | "\x10" e_name int32            32-bit integer
           | "\x11" e_name uint64           Timestamp
           | "\x12" e_name int64            64-bit integer
           | "\x13" e_name decimal128       128-bit decimal floating point
           | "\xFF" e_name                  Min key
           | "\x7F" e_name                  Max key

*e_name*   ::= cstring                  Key name
*string*   ::= int32 (byte\*) "\x00"     String
*cstring*  ::= (byte\*) "\x00"           UTF-8 encoded characters followed by '\x00'.
binary   ::= int32 subtype (byte\*)    Binary - size, subtype(byte), and data.
code_w_s ::= int32 string *document*    Code w/ scope