text: Title: Caching / Memoization of Functions
  Body: I have tried writing a cache decorator (albeit with needing to define the cache data holder separately).  However when running this, only external calls are accessing the decorated function - maybe because the function is being compiled before decorated?
  
  Minimal example below using something along the lines of fibonacci.
  
  Bit stuck - is there a way to do memoization?  (ideally without creating a separate store - I've tried using a class but can't see how to make it generic for the function parameter args and return type)
  
  ```python
  # memoization / caching with codon (functools.cache etc are not developed yet)
  
  cache_store = Dict[int, int]()   # need to manually configure cache for now.
  
  def cache(func: function):
      print(f"Caching {func}")
      def inner(val: int) -> int:
          if val in cache_store:
              print(f"Getting {val} from cache")
              return cache_store[val]
          else:
              print(f"Calculating {val}")
              result: int = func(val)
              cache_store[val] = result
              return result
      return inner
  
  @cache
  def fibo(n: int) -> int:
      print(f"fibo calculating {n}")
      if n < 2:
          return n
      else:
          return fibo(n - 1) + fibo(n - 2)    ## << not accessing decorated function
  
  print("*"*20)
  
  f4 = fibo(4)
  print(f"{f4=} : {cache_store=}")
  
  print("*"*20)
  
  f6 = fibo(6)
  print(f"{f6=} : {cache_store=}")
  
  print("*"*20)
  
  f6 = fibo(6)
  print(f"{f6=} : {cache_store=}")
  ```
  
  Result:
  
  ```Caching <function at 0x7f703eae0cb0>
  ********************
  Calculating 4
  fibo calculating 4
  fibo calculating 3
  fibo calculating 2
  fibo calculating 1
  fibo calculating 0
  fibo calculating 1
  fibo calculating 2
  fibo calculating 1
  fibo calculating 0
  f4=3 : cache_store={4: 3}
  ********************
  Calculating 6
  fibo calculating 6
  fibo calculating 5
  fibo calculating 4
  fibo calculating 3
  fibo calculating 2
  fibo calculating 1
  fibo calculating 0
  fibo calculating 1
  fibo calculating 2
  fibo calculating 1
  fibo calculating 0
  fibo calculating 3
  fibo calculating 2
  fibo calculating 1
  fibo calculating 0
  fibo calculating 1
  fibo calculating 4
  fibo calculating 3
  fibo calculating 2
  fibo calculating 1
  fibo calculating 0
  fibo calculating 1
  fibo calculating 2
  fibo calculating 1
  fibo calculating 0
  f6=8 : cache_store={4: 3, 6: 8}
  ********************
  Getting 6 from cache
  f6=8 : cache_store={4: 3, 6: 8}
  ```
  