Exception handling in indexing process

This improves the exception handling in the entire indexing
process, that is, `Index`, `SourceIndexer` and `ProjectIndexJob`,

Generally `Try` is used to indicate that methods might fail. Most
failures related to indexing is handled in `ProcessIndexJob`. If
the index breaks it is deleted and a fresh one is created. If it
can't get the parse trees because the presentation compiler is broken
it will stop the indexing job and log the error. Files that can't
be indexed because of an IOException will be ignored and the
error logged

Tests have been added for the behavior of `Index` and `ProjectIndexJob`
when failures do happen.

Fix #1001629
Merge pull request #22 from mads379/1001629-handle-exceptions

1001629 handle exceptions in Index
Now controls life-cycle of `ProjectIndexJob`s

The life-cycle of the `ProjectIndexJob`s is now managed
by `IndexJobManager`. It listens to `open/close/delete` events
on the projects in the workspace using `ProjectChangeObserver`.

Tests have been aded for both the `ProjectChangeObserver` and
`IndexJobManager`

I now manage dependencies between various components using the
cake pattern.

Fix #1001609, #1001610