   TODO:
    - lots of duplicatish code to remove:
           decode cases are similar too: array/ref, map/ref/ array/binary/short-binary
    - discard values that don't need to be built
        - profiling shows that we can spend a lot of time setting values in maps that we might throw away
        - if we don't need to keep the value, we should try to not actually create it in memory
    - how do we handle hashes?
       : only string keys are supported -- do we call value.String() or panic()?
       : what other coersions (ints <-> strings)
    - roundtrip test: perl obj -> perl-sereal stream -> go1 obj -> go-sereal stream -> go2 obj, DeepEqual(go1, go2)
    - class names need their own string table (for OBJECTV)
    - string table should have hash keys only? (unless dedup strings is true?)
    - string vs. byte array handling?
    - match 'ptr->array':ARRAYREF and 'ptr->hash':HASHREF
        - go can't do this in one-pass: we don't have ref counts
