Major refactor of fn code gen. Pieces of arity overloading implemented.
Add (hopefully all) necessary checks for valid overloads.
Add specs for invalid arity-overloaded fns
Tweak the checks for valid overloads.
Refactor checks for valid overloads
Fix little bug in overload checks
Split FnScope into OverloadScopes. Prepare for overload codegen.
Add codegen for overloads.

IT WORKS IT WORKS IT ACTUALLY WORKS
Fix "No matching overload" detection.
Detect duplicate argument names and complain.
Fix an overload arity check.
Add specs for duplicate argument names.
Fix a nasty bug involving variable lookups in enclosing scopes and overloads.
Fix insignificant typo.
Fix bug with optional args and variadic overloads.

Basically, the compiler would reject forms like
  (fn
    ([[x 1]] x)
    ([x & rest] rest))
which are perfectly reasonable. 0 or 1 arguments will call the first
overloads. 2 or more will call the second.
Add tests for valid overloaded fns.
Test going outside the Ruby-enforced argument arities on overloaded functions.

This means fns like (fn ([x y] 2) ([x y z] 3)) which Ruby should not allow to
be called with less than 2 or more than 3 arguments, if the Apricot compiler
is working correctly.
Add tests for overloads with gaps in their allowed arities.

This means fns like (fn ([] 0) ([x y] 2)) where Ruby will allow it to be
called with 0, 1, or 2 arguments, but Apricot must generate code to raise an
exception for the 1 argument case.
Use arity-overloaded fns in Apricot::Core.