Merge pull request #24 from mads379/1001610-react-to-open-and-close-events

Now controls life-cycle of ProjectIndexJobs
IndexJobManager does no longer inherit from Index

There is no need for ``IndexJobManager`` to inherit from ``Index``. Using
composition here is better and reduces coupling.

This is a follow-up on the discussion that happened in
https://github.com/scala-ide/scala-search/pull/24
Merge pull request #27 from dotta/transient/index-job-manager-alternative-design

IndexJobManager does no longer inherit from Index
Ask user to file a ticket when a `ScalaSearchException` goes uncaught
`IndexJobManager.startup/shutdown` are now thread-safe

* Prevent that a call to `shutdown` could happen while `startup` is running.
* Calling `startup` or `shutdown` twice will result in an exception.
* All accesses to the `indexingJobs` now always occur with the `lock` held,
  Hence the `concurrent.TrieMap` is no longer needed (the standard `HashMap`
  is likely faster as it doesn't contain logic for correctly handling
  concurrent accesses).
* Added a note to explain why the initialization of `observer` is done in the
  `startup` method and not the class' constructor.
* When reacting to `ProjectChangeObserver.onDelete`, delete the project's index
  only if it exists (I figured there is no need to log a debug message if the
  index doesn't exist).
* All methods in the `IndexJobManager` expect to be called only after the
  `startup` method has completed, and to never be called after `shutdown`.
  This assumption is now enforced in the code.
Merge pull request #28 from dotta/transient/random

Transient/random
API for getting symbol at location

This commit provides an API for getting the symbol at a specific
location in a file. It introduces an implicit value class that
is used to add functionality to the presentation compiler.

A small test case has been provided

Fixes #1001662