Implement optional arguments

Optional arguments appear as arrays of name and default value within the
argument list array: `(fn [x [y :default]])`

Having required arguments after optional arguments results in undesired
behavior, as the optional argument is filled first when the function is
called, resulting in the required argument being nil.

Optional arguments and splat arguments should get along fine, although
this has not been thoroughly (read at all) tested.
Add tests for optional arguments
Add tests for splat arguments
Add tests for optional and splat arguments in one fn
Make prefix argument optional on Apricot::Core/gensym
Make else clause optional in Apricot::Core/if-let
Only allow optional arguments to be last
Add tests for invalid fn forms