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 (`IOException`, `CorruptIndexException`)it is deleted
and 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.

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

Fix #1001629