modify Serializer::Reader to work from an externally provided ByteRange

This eliminates the pointless allocation and copying that happened when
Reader had its own copy of the data in a std::string, and makes it easy
to create a Reader to deserialise data from a FileData object (ie, easy
to use with FileSystem).
Merge remote-tracking branch 'jpab/filesystem-serialiser'