Add domain model for LLVM IR types

This is the first part of our LLVM generation code. It's taking a hint
from GHC in having our own model of the LLVM IR. Llispy directly built
strings as part of the code generator which got messy
Bool32 => Bool8

Turns out on x86-64 a boolean is one byte
LLVM IR function declaration support

This allows the declaration but not the definition of functions.
Support for LLVM IR constants

Except for ArrayConstant this is fairly strongly typed
Fix case of LlambdaApp

This matches the case used elsewhere and the actual object name
SemanticException cleanup

- Move SemanticException to frontend

- Move all SemanticException classes to SemanticException.scala and make
  SemanticException sealed

- Add a required semanticErrorType string to SemanticException instead
  of hardcoding the table in Repl.scala. This should allow the compiler
  to reuse that information and makes sure the REPL will catch all
  semantic errors

- Make LibraryNameMismatchException a SemanticException

- Distinguish parse errors from semantic errors more clearly in the REPL

- Clean up some parameter names, make more parameters val
Make DefaultLibraryLoader.load take Seq

Previously it was taking a List which doesn't match the signature
expected by ExtractProgram
Skeleton code for code generation

- Add prelude.ll for static LLVM delarations the compiler uses. This is
  based on preamble.ll from Lispy

- Add command line parsing to LlambdaApp. Pull it scopt 3.0.0 to
  implement this.

- Add Compiler.scala that similar to Repl.scala in that it parses the
  input file and creates expressions to pass to frontend.CodeGenerator

- Add frontend.CodeGenerator. This currently only outputs prelude.ll