test.py: add sine wave to data in Fragment.offset
splat.data.Fragment: add dup() to duplicate fragment
splat.data.Fragment: add md5() to get MD5 sum of all data
test.py: add cases for Fragment.dup and Fragment.md5
_splat.c: add float sample mode to Fragment.as_bytes(0)

* when the sample_width is set to 0, use the native floating
  point sample format (typically double, so 64-bit values)
* add full docstring for manual
doc/splat.rst: add missing native data.Fragment methods
tests.py: update Fragment.md5 case + tidy-up
rename _splat.sample_precision to get_sample_precision

* rename _splat.sample_precision() to get_sample_precision
  as it's a function
* export integer in splat/__init__.py as sample_precision
  which takes the value of _splat.get_sample_precision
* update tests, docs and import statements in __init__.py
rename Fragment.sample_rate to Fragment.rate
_splat.c: add `length' kwarg to Fragment_init and _resize

* Fragment_init: add `length' keyword argument to specify the
  length of the fragment in frames (samples per channel) as an
  alternative to duration in seconds - both can't be used at the
  same time

* Fragment_resize: add `length' keyword argument like in init

+ update doc and docstrings accordingly
splat.data.Fragment.open: add support for saf files

* add support for Splat Audio Fragment 'saf' file format
  which is a Splat specific format with all the sound
  data directly compatible with a Fragment (i.e. 64-bit
  floating point or 'double')

* fix issues with file extensions and explicit file format
  identifier in Fragment.save and .open

* add saf case to test_frag_save