Add FeatureDetector caching.

Implements #36 
Is it possible to re-raise the stored exception? While manually re-raising the new exception while using the old `message` works, we will lose any extra data that is stored within the exception (such as the stack trace) and it locks the implementation down quite a bit.