Adding a way to get thrown errors that have been forgotten about

If you throw an error into a future, but you never wait or detach that future, those throws would be lost. This commit adds a way to grab all the forgotten about errors and do something about them (probably log them so you can fix the fact that you forgot about them). 

I also made some minor improvements, modularized some code duplication in Future.wait, and added a todo for detach to cause errors to be thrown from the future.throw call *always* instead of sometimes throwing it from the future.detach call itself.