add member to check a function is template or not
get reference to contents of variant instead of copying
check target type is included in types variant holds
implement overload resolution and get type on function invocation

- how to use return type for overload resolution is TODO
- checking function duplication should consider overloaded resolution
  - now it doesn't and only checks name
- type inference from return statement in the function is TODO
Merge branch 'wip'