[x] rename samples() + num_samples() to raw_samples() + num_raw_samples()
[x] add bytes() + num_bytes()
[x] bytes are always present
[x] raw samples may be NULL
[x] there is a flag indicating if raw samples are present
[x] raw_samples() and num_raw_samples() should panic if called on frame without that flag
[x] add duration() and set_duration()
[x] duration may be set even if raw_samples() are NULL
[x] Add SampleFormat enum
[x] Extend SampleSpec
[x] add SampleFormat and PcmFormat fields to SampleSpec
[x] add SampleSpec.is_raw() method (returns true if SampleFormat is interleaved PCM with 32-bit native-endian floats, i.e. samples are in "raw" format and raw_samples() is available)
[x] add converters between byte size and timestamps (STS and ns)
[x] Update pipeline components
[x] find components that don't really need raw samples and port them to duration()
[x] find all components that use Frame::raw_samples(); add a panic to their constructors that SampleSpec::is_raw() is true (to catch bugs with pipeline configuration earlier)
[x] remove pcm_format from rtp::Encoding; use PCM format from SampleSpec instead (rtp::Encoding already contains SampleSpec)
[x] Update printer
[x] Frame::print() should include flags and duration
[x] PCM mapping
[x] implement PcmMapperReader (frame reader, maps frames between PCM formats using PcmMapper)
[x] implement PcmMapperWriter (frame writer, maps frames between PCM formats using PcmMapper)
[x] add PcmMapperReader to receiver pipeline (converts frames from raw format to receiver output format)
[x] add PcmMapperWriter to sender pipeline (converts frames from sender input format to raw format)
[x] Rework audio::Frame:
[x] Add SampleFormat enum
[x] Extend SampleSpec
[x] Update pipeline components
[x] Update printer
[x] PCM mapping