data.Fragment.as_bytes: add start and end arguments

* _splat.c: add NO_DOUBLE macro to be used when a double value is
  not used
* _splat.Fragment.as_bytes: add optional start and end arguments
  and slice the byte array accordingly.  Also add some bounds
  checks.
* splat.data.Fragment: allow file-like objects in Fragment.open
  and Fragment.save and tidy-up tests to catch more errors
* test.py: add test_frag_as_bytes which also covers the new start
  and end arguments, and test_frag_save using StringIO file-like
  objects