Refactor the way xcffib handles struct lengths

There is no reason to keep the of struct.pack encodings around with
struct.calcformat. Further, size, count, and length were confusing in a lot of
places. So instead we just wrap all that logic (along with offset) up into a
single class.

In reality this came from a need to know the size of a struct before unpacking
it, due to the way cffi's API works (.buffer() requires a size). We don't
necessarily know the size (although in most cases we do), so we need to
support unpacking things where we don't know the buffer size until after the
struct is unpacked.