Added GjsInterruptRegister interface and GjsDebugInterruptRegister object.

This interface (and object) serve as a central point for clients to connect
to SpiderMonkey's internal debugging functions without stepping on each other.

Through GjsInterruptRegister, clients are able to connect to the general
execution hooks (such as entry and exit of new functions and source files),
enable single-step mode and recieve interrupts and add arbitrary breakpoints
on source files.

Each of these functions takes a callback and returns a GjsDebugConnection.

This object is effectively just a handle for an active connection to the
debugging interface. Once clients are done with a particular debugging hook
they should unref their connection. This will automatically call back into
the interrupt register's implementation and handle the proper tear down
of that hook inside of SpiderMonkey if required.
Integrate GjsProfiler with GjsInterruptRegister.

GjsProfiler now takes a strong reference to GjsInterruptRegister and
uses its function calls and execution hook in order to gather profiling
info instead of using SpiderMonkey's debugging API directly
Added GjsCoverage object (and thus code coverage support).

This object effectively just takes a connection to the single step
handler and records how many times we hit each line. It then provides
a function to write this data out to a GFile, or if the GFile provided is
NULL, writes to $(file).js.info.

To prevent clutter, paths considered to be part of the coverage report
must be specified inclusively, anything not part of those paths will not
be included in the coverage report.

The coverage tool is integrated in to gjs-console, you can use it by
specifying -C or --coverage-path to add a path to generate coverage reports
for and using --coverage-output to write coverage data to a single file.