Major refactor of ExtractModuleBody

- Make ExtractModuleBody a class, rename it to ModuleBodyExtractor and
  have it take libraryLoader/includePath as constructor arguments. This
  prevents them from being passed to nearly every method as implicit
  args

- Make new extractGenericExpression that's responsible for handling all
  expressions with a flag indicating if it should accept outermost
  definitions

- Make extractGenericExpression extract from ScopedProperList once and
  then pass the members down to extractApplicationLike. This prevents
  repeated extractions against ScopedProperList which are O(n) with the
  length of the list

- Add new extractApplicationLike that handles everything that looks like
  an application, including defines. This resolves the symbol once and
  passes that down to extractSymbolApplication and (optionally)
  parseDefine

- Make (define) and (define-syntax) proper identifiers exported from
  (scheme base). This removes some special casing of them as strings and
  follows R7RS. However, it required modifying some unit tests to import
  (define)

- Propagate source location when calling rescope()

- Use an explicit error message when using defines in the wrong location