Utility class that wraps the boilerplate needed to set up a new SPV bitcoinj app. Instantiate it with a directory
and file prefix, optionally configure a few things, then use startAsync and optionally awaitRunning. The object will
construct and configure a BlockChain, SPVBlockStore, Wallet and PeerGroup. Depending
on the value of the blockingStartup property, startup will be considered complete once the block chain has fully
synchronized, so it can take a while.

To add listeners and modify the objects that are constructed, you can either do that by overriding the
onSetupCompleted() method (which will run on a background thread) and make your changes there,
or by waiting for the service to start and then accessing the objects from wherever you want. However, you cannot
access the objects this class creates until startup is complete.

The asynchronous design of this class may seem puzzling (just use AbstractIdleService.awaitRunning() if you don't want that).
It is to make it easier to fit bitcoinj into GUI apps, which require a high degree of responsiveness on their main
thread which handles all the animation and user interaction. Even when blockingStart is false, initializing bitcoinj
means doing potentially blocking file IO, generating keys and other potentially intensive operations. By running it
on a background thread, there's no risk of accidentally causing UI lag.

Note that AbstractIdleService.awaitRunning() can throw an unchecked IllegalStateException
if anything goes wrong during startup - you should probably handle it and use Throwable.getCause() to figure
out what went wrong more precisely. Same thing if you just use the AbstractIdleService.startAsync() method.

If a seed is set here then any existing wallet that matches the file name will be renamed to a backup name,
the chain file will be deleted, and the wallet object will be instantiated with the given seed instead of
a fresh one being created.

setDownloadListener

If you want to learn about the sync process, you can provide a listener here. For instance, a
org.bitcoinj.core.DownloadProgressTracker is a good choice. This has no effect unless setBlockingStartup(false) has been called
too, due to some missing implementation code.

setAutoStop

setCheckpoints

If set, the file is expected to contain a checkpoints file calculated with BuildCheckpoints. It makes initial
block sync faster for new users - please refer to the documentation on the bitcoinj website for further details.

setBlockingStartup

If true (the default) then the startup of this service won't be considered complete until the network has been
brought up, peer connections established and the block chain synchronised. Therefore AbstractIdleService.awaitRunning() can
potentially take a very long time. If false, then startup is considered complete once the network activity
begins and peer connections/block chain sync will continue in the background.

useTor

If called, then an embedded Tor client library will be used to connect to the P2P network. The user does not need
any additional software for this: it's all pure Java. As of April 2014 this mode is experimental.

restoreWalletFromSeed

If a seed is set here then any existing wallet that matches the file name will be renamed to a backup name,
the chain file will be deleted, and the wallet object will be instantiated with the given seed instead of
a fresh one being created. This is intended for restoring a wallet from the original seed. To implement restore
you would shut down the existing appkit, if any, then recreate it with the seed given by the user, then start
up the new kit. The next time your app starts it should work as normal (that is, don't keep calling this each
time).

isChainFileLocked

Tests to see if the spvchain file has an operating system file lock on it. Useful for checking if your app
is already running. If another copy of your app is running and you start the appkit anyway, an exception will
be thrown during the startup process. Returns false if the chain file does not exist or is a directory.