Initial implementation of SPPlaylist refactor

The refactor attempts to appease the problem
in which large playlists cause insane CPU/RAM
usage. The problem is that SPPlaylist attempts
to keep an accurate object model in RAM at all
times, which is actually a really terrible idea,
since it's actually very rare that you want every
single track in the playlist in RAM at once.

The new SPPlaylist implementation doesn't keep
an object model in RAM. Instead, the client asks
for ranges of tracks and the playlist will tell the
delegate when parts of it change.

Change-Id: Idd71337bc82e8709738e29cef16e4b73f200b0ce