I think it might be a good idea to introduce a helper function for the C string format to make things more general instead of introducing more `va_list` on specific scenarios, so we can just let `mrb_output_backtrace` return an array of callers, without adding extra abstraction on `output_stream` or introduce any async logic.

I've implemented a `mrb_str_new_format()` in my branch, you can cherry-pick it if you like: 

https://github.com/Fleurer/mruby/commit/92306c2319438060937e59a1cab26c74fc1da42d

thanks