Add SPPlaylistProvider protocol

Change-Id: I25dfacec9ca3dc977d46f5a9ba3807478782ddf3
iOS: Add first draft of SPPlaylistPicker and friends

Change-Id: Ia7a7391fab2710d3438ad7e9b824ee5a4e73a9ff
iOS: Add sample project "Playlist Picker"

Change-Id: Iaed14f6417e2ff48a0415c86fd85ea247bf0a3ee
Add -[SPSparseList -unloadObjectsAtIndexes:]

Change-Id: I787d38fa74b730597d5a907f38ef570a17ba4c8d
Add -name to <SPPlaylistProvider>

Change-Id: Ib47bbe78ab1ff66473a0f56b88a9255294bd5f78
Add -[SPSparseList loadedIndexesInIndexes:]

Change-Id: Ic905fa5473932b38f1757af5687dd78823b55175
iOS playlist picker: Show loading rows in light grey and show titles in header

Change-Id: I1f9a08b70a5237d1e0bf214833cfdec9512827cb
SPPlaylistViewController: Intelligently unload tracks furthest away from the viewport when scrolling large playlists

Change-Id: I67bb323949f8d524a99a344834f1c551754b220d
Revert "SPURLExtensions: Allocate correct amount of memory for each link"

This reverts commit 5bad5103134136a59b92b50e0a66a4bd71e1747f.

sp_link_as_string() is quite CPU-heavy, so calling twice isn't worth the temporary RAM savings.

Change-Id: Ie65126c22cd5a66f24952f6b23638cfafb4ebab0
SPPlaylistViewController: Don't redraw cells that aren't visible after loading a track

Change-Id: Iab4a5e9e139b327ed3462027229d0a2ba9d87854
Show SPPlaylistPickerViewController as a form sheet on iPad

Change-Id: Ie7338d144c656b84b04db7f5f04708823b7771a6
SPSparseList: Correctly handle a nil callback block in -loadObjectsInRange:callback:

Change-Id: If801a06ff8aa39fade009b6ccd198bc3dd0bc859
SPPlaylistViewController: Preload tracks when we know where a long scroll will land

Change-Id: I099d00414178f9e4cc5c1146e050c72c24e8afc4