Break out FileSource interface

Reworks `FileSource` as an abstract class and adds `CachingHTTPFileSource` as an implementation. Alters `Map` constructor to accept a `FileSource` implementation as an argument, setting the libuv loop where it originally constructed a new `FileSource`. This will eventually allow a `LocalFileSource` implementation in the future.

Would appreciate a code review on this from @artemp or @DennisOSRM, @springmeyer mentioned that there is some overhead involved in abstract classes and that templates may be a faster (but less flexible?) solution.

/cc @jfirebaugh 
This should be a stack variable if possible, or a unique_ptr if not.