Created memoizeFetch helper and added to BaseModel and BaseCollection

The idea behind this is that any time `fetch` is called we want to reuse
the most recent "active" promise unless we pass `force: true` as an
option.
Converted memoizeFetch to cachePromise

After considering this a bit more it felt like memoization was overkill
and perhaps deterimental as it maintained a reference to all previous
promises. By overriding the hashFunction the way we were it was
essentially converting the memoize function into a single-element cache.

This cachePromise implementation makes that more obvious.