Make delegate public

- Made `delegate` property and `SessionDelegate` class `public` so we can reference them elsewhere.
- Also make `public` the various closures of `SessionDelegate` (as that's why we're defining the delegate as public)
Modified downloads to better handle background sessions

1. Modified `SessionDelegate.URLSession(session:, downloadTask:, didFinishDownloadingToURL:)` so that

 - The session `downloadTaskDidFinishDownloadingToURL` returns a `NSURL`, but it didn't use it! Modified to use it.

 - Modified it to only call session rendition of `downloadTaskDidFinishDownloadingToURL` if it concluded it could call the request rendition of the block confusingly called the same thing.

 - We probably should have more robust error handling here (e.g., if it couldn't find either shouldn't we report error somewhere?) and update the documentation because the above changes the functional behavior of the session-level `downloadTaskDidFinishDownloadingToURL`.

2. Modified the `download` methods so that the `destination` closure was optional. It makes no sense to force the programmer to provide a completion closure, because if background session, the app may be terminated and this closure will disappear anyway. If doing background downloads, let the user pass `nil`.