Integration of fragmented mp4 support (CVP2RI-390)

The ODIDMediaEngine's MP4 utilities have been expanded to support generation
 of time-seek response data from fragmented mp4 source content. Specifically:

 To support trimming that can start/end in a MovieBox or a MovieFragmentBox,
 an abstract IsoAccessPoint is introduced to allow the trimming code to deal
 with the various trimming permutations much more easily. SampleTableBox.
 AccessPoint (previously a struct) and TrackRunBox.AccessPoint derive from
 IsoAccessPoint, providing references into their respective structures.
 And IsoFileContainerBox.FileEndAccessPoint defines an AP that refers to
 end-of-file. Th

 IsoFileContainerBox.get_random_access_points()/
 get_random_access_point_for_time() is implemented to return access points
 by interrogating the MovieBox and MovieFragmentBoxes and return a list of
 IsoAccessPoints. It in turn delegates to IsoSampleTableBox/
 IsoTrackFragmentBox.get_random_access_points().

 IsoFileContainerBox.get_access_point_for_time() is implemented to return a
 single AccessPoint that refers to a sample on the primary track for the
 given time value. It in turn delegates to IsoSampleTableBox/
 IsoTrackFragmentBox.get_access_point_for_time().

 IsoFileContainerBox.get_track_box_for_time() is changed to take a track id
 and to provide a relative offset into the track box. And it now supports
 fragmented mp4 content.

 IsoFileContainerBox.trim_to_time_range() is greatly refactored to deal
 with fragmented mp4 content. All functionality is delegated to new functions
 trim_movie_box(), trim_segment_start(), trim_segment_end() and
 remove_remaining_boxes(). In combination, these can deal with the various
 start/end point permutations and remove/subdivide/rebase mdat, MovieBox,
 and MovieFragment boxes appropriately.

 IsoFileContainerBox.trim_movie_box() now deals with cases where all samples
 are removed from the MovieBox and delegates to IsoMovieBox.
 remove_samples_before/after_point(), remove_all_sample_refs(), and
 adjust_track_chunk_offsets().

 IsoFileContainerBox.trim_segment_start() and trim_segment_end() deal with
 rebasing boxes and removing boxes pre-start/post-end and call
 IsoMovieFragment.remove_samples_before/after_point(), respectively.

 NOTE: IsoMovieFragment.remove_samples_before/after_point() are not
       currently implemented. Since DLNA reference content was the priority,
       and only contains one sync point per Movie/TrackFragment, no
       inter-fragment trimming is required with this content. Supporting
       other content formats will require implementing these methods.

The test functions in main() have been updated to utilize the updated
 AccessPoint and trimming functionality.

IsoBox now has ordering functions: precedes(), follows(), and
 immediately_precedes()/follows() with supporting functions in
 IsoContainer. These are used by IsoFileContainer.trim_to_time_range()
 and its delegates.

Tested with a wide variety of DLNA segmented and non-segmented reference
 content with a wide variety of time-range values via the test interface
 (main), curl APIs, and CTT/MCVT tests.