About templates, they're like C macros, a simple way to do metaprogramming
without manually building syntax like in Nim macros. They're not like procs in
that they aren't called at runtime, they simply exist during compile time and
transform AST given to its parameters. An `untyped` parameter is any raw AST
that hasn't been type checked yet, and a `typed` parameter has been type
checked and gone through AST transformation. If you name a template parameter
like `x: int`, `x` will be type checked and have the int type. If you want a
value to use in a template inside `when` expressions or other static checks
instead of an expression like `x: int` would give, you can use `static[int]`,
but it's not entirely stable yet.