compiler: Use square lists for type annotation

There are a few places in our code and tests that still use (identifier
: <type>) from before square list support was implemented. Move them to
[identifier : <type>] for better consistency and readability.
compiler: Rename semantic exceptions

Rename the following exceptions to match their upcoming Scheme error
category predicates:

- ImpossibleTypeConversionException => TypeException

- IncompatibleArityException => ArityException

- OutOfBoundsException => RangeException

This also cleans up some unused imports of the above exceptions
Clean up Scala pseudo-enums

Switch from using the following pattern:

object Foo {
  sealed trait Foo
  object Bar extends Foo
}

To:

sealed trait Foo
object Foo {
  object Bar extends Foo
}

This means we can refer to the enum type itself as simply "Foo" instead
of the confusing "Foo.Foo"
stdlib: Remove unreachable signalError()
runtime: Add new error categories

This adds the following additional error categories:

- "Type" is for type conversion failures and corresponds to
  TypeException in the frontend

- "Arity" is for arity mismatch failures and corresponds to
  ArityException in the frontend

- "Range" is for out-of-range failures and corresponds to
  "RangeException" in the frontend

- "Utf8" is for UTF-8 encoding errors and has no corresponding frontend
  exception

- "DivideByZero" is for divide-by-zero errors and has no corresponding
  frontend exception

- "MutateLiteral" is for attempts at mutating literal values has has no
  corresponding frontend exception (yet)

- "UndefinedVariable" is for attempts at accessing a variable before its
  definition
compiler: Support for error categories

- Add an ErrorCategory object reflecting the error categories defined in
  the runtime

- Have RuntimeErrorMessage take a mandatory category parameter

- Update the users to RuntimeErrorMessage to pass the correct category

- Update llcore_signal_error and GenErrorSignal to pass the category to
  the runtime
tests: Fix typo in test name
tests: Remove "body" from (assert-raises) message

"body" is a zero-or-more match so it just expands as "body" here. The
actual wrapped body can be quite large so just omit it entirely
stdlib: Add (llambda error)

This exports predicates for our non-R7RS error categories
tests: Add (expect-error?)

This asserts that a test raises a specific error category, either at
compile time or runtime. This largely replaces (expect-failure) except
for a number of problematic places where we're not raising the correct
error.
tests: Use specific (assert-raises) predicates

Instead of using (error-object?) use predicates for specific error
categories
tests: Remove expect-runtime-failure

This can be replaced entirely by (assert-raises) which can also test for
specific error categories.
tests: Fix polymorphic return value test

The test was attempting to use a type as an expression which made it
fail regardless of the return value type violation
tests: Fix (make-bytevector) int conversion tests

These were using the old NFI function declaration form so they were
unconditionally failing without testing the intended conversions.
tests: expect-compile-{failure => error}

This replaces expect-compile-failure with expect-compile-error. This
behaves the same except it takes a predicate for testing the raised
error.
tests: Fix writing to input port test

This was using (current-input-stream) instead of (current-input-port) so
it was always failing with an unbound variable