Allow pipelines to be interrupted and shutdown cleanly
Allow pipelines to be interrupted and shutdown cleanly

- Pipeline.shutdown attempts to shutdown all block threads in pipeline
- On shutdown, block threads are killed after Pipeline.shutdown_timeout
- Pipeline.shutdown_on_signals([signals]) can be used to catch signals

ledatelescope/bifrost,ledatelescope/bifrost,ledatelescope/bifrost,ledatelescope/bifrost