Go back to using a std::thread for tiles

It appears that the std::future thing I was using doesn't actually
appear to work -- only one of them ever gets executed at a time.  As I
don't fully understand what they're supposed to be for, I instead have
just decided to go ahead and use a std::thread and handle my own
return values.

This is a little bit nasty because I have to handle the return value
with a special variable, but I guess that's good enough for now.
Wake up other queues when an operation happens

Whoops!  I didn't notice this before because the std::future bug means
only a single tile was executing at once, which resulted in an
ordering for my very simple test that happened to need no
notifications to work.

This now _actually_ works... :)
Make simple_tile match the new main() format
Add a more complicated communication test

While this is still pretty simple, it does require the different tiles
to actually run in parallel and can result in some blocking.