API/REF/ENH: Use PyAV for Video.

A major difficulty with video files is that they are not set up for random access by frame number. This is a much better way of getting reliable random access. It does not require creating any large binary files. It does not use a subprocess move data through a pipe.

Instead, it uses PyAV's Cython bindings to FFmpeg. PyAV uses the proper abstractions for video (container, packet, frame) to enable accurate random access. On loading, it quickly looks through the whole video to map out where each frame number is located in each packet -- a table of contents.
`self._toc.search_sorted(j)` would probably be faster here