Require unique componentProvider key names.

This allows for multiple componentProvider impls to be specified in
the same .properties file.
Add support for singleton scheduled jobs.

The runnable for a singleton job is wrapped in a
SingletonContext (which is also a runnable), and the context is given
to Quartz as the job runnable. On each job firing, the context only
runs the job if it determines it is the master for this singleton.

When clustering isn't enabled or we're running embedded, the
AlwaysRunContext is used. In a cluster, the ClusteredSingletonContext
is used, which determines if it is master using the following algorithm:

- if it has already been notified the id of the master mode for this
  context name
- if that id is its own node's id, then the job is run, otherwise it
  is skipped
- if it hasn't been notified the id of the master node, it acquires a
  cluster-wide lock for the context name, and notifies every member of
  the cluster view (including itself) that it is the master
- each node stores that id if it doesn't already have a master, and reports
  back who it thought was master (which will be null or the id of a node
  other than the one holding the lock)
- the requester collects these responses, and determines it is master if all
  of the results are null (meaning no one was the master). If one or more of
  the nodes returns an id, that id is the master. If the nodes return more
  one id, the cluster is in an inconsistent state and we throw.

Issues:

- serializability: the context likely won't serialize well, which makes it even
  harder to use a JobStore

- if a node was master, then gets killed, then restarts to join the cluster it left, it will log:

     09:11:31,452 WARN  [org.jgroups.protocols.TP$ProtocolAdapter] (INT-1,shared=udp) JGRP000031: node2/default: dropping unicast message to wrong destination befd1dba-1a27-ddcb-d9ee-15d6738608f3

  until the other nodes are killed and it becomes master again. I suspect this is an issue with
  trying to acquire a lock, and it has a stale view.
Remove debugging messages, add copyright headers.