Add @cached() decorator

Caches a function's return value based on its arguments.
Merge pull request #56 from fusionbox/cached

Add @cached() decorator