Searching for music library tracks, finding all artists' albums and artist's album's tracks.

Adds searching for music library tracks, finding all artists' albums and artist's album's tracks.

This adds a set of search methods for the *music library* (not music services) by the means of updating `get_music_library_information` to support fuzzy searches, category searches and getting all matches by handling paging through results.

The new methods (that all call `get_music_library_information` with the new args) are:
* `search_tracks`: to find everything for an artist, artist+album, artist+album+track combinations
* `get_albums_for_artist` to get all albums for an artist
* `get_tracks_for_album` to get all tracks on an artist's album

The code works well and I've used this to search for a bunch of music library tracks automatically. It took a while to get the Unicode and URL encoding working especially from py2.6 to 3.x.  I also added a new compatibility call quote_path from urllib or urllib.parse (py3) that is used by new utility function `url_escape_path`. 

You are probably right about it being the 701, I'm not sure.

I agree that we should probably do something about it. These error numbers are actually tabulated by @lawrenceakka in a dictionary in the ContentDirectory class, so making constants for them may not be the bast idea (two places to maintain then and all that).

So I see (at least) two options:
 * Simply add the explanation ( 'No such object' UPnP errors) as a comment and refer to that class or
 * (slightly more convoluted) make a method on the service (errorcode_from_errorstring) that makes a reverse look-up in that dict and use that to get the error code.

I think maybe the comment should do for this case.