Allow event listeners to listen to HIT, MISS and STALE events from engine

Previously it was not possible to listen to the events emitted by the engine. This refactor returns the engine with the memoize function tacked on.
I do this so to keep a tight interface.