[bert] always throw Error instances

Throw Error instead of string objects so that crashes are
easier to diagnose when bert.js is used in mocha tests.
[bert] decode NIL_EXT bytes as empty list, not null

erlang external term format represents null as empty-list, so decoding
NIL_EXT bytes needs to result in [] to avoid lists being unintentionally
converted to null.
[bert] don't coerce dict keys to atom on encode
[bert] support encode/decode using node Buffer objects
Merge branch 'decode-null'
Merge branch 'dict-keys'
Merge branch 'error-cleanup'