'error: the trait `core::marker::Send` is not implemented for the type `TFoo` [E0277]
This is not surprising because (and please correct me if I'm wrong), the compiler does not know if the actual underlying object of the trait object Foo is Send or not. So the question is, is there a way to send a trait object between threads?
You can require trait objects implement Send or Sync via + Send or + Sync. In this case, pub data: Box<Foo + Send>.
This is sadly a pervasive decision: everywhere you expect a trait object you need to choose if you require it to be Send or Sync upfront, and once it's been trait-ified you can't upgrade to + Send.