Don't allocate buffers for huge tag offsets

- There seems to be a relatively common corrupt tag which has an offset
  of MaxUint32. This is probably not a valid offset, so return early
  before we allocate a slice this large.
- Read tag values into a bytes.Buffer. This will prevent allocating
  memory beyond the size of the image file in the event that a tag is
  invalid or corrupt.
- Fixes issue #20