die() calls vprintf, fputc and exit; none of these are async-signal-safe, see `man 7 signal-safety`.
all the other prototypes use names.
maybe leak isn't the best word, given that the object lives for the entire duration of the program's lifetime. however, all elements of scheme are free-ed, can't think of any reason why scheme itself should be an exception.