Inspired by former implementations by Eric Lombrozo and Rusty Russell, and based on code by Jorge Timon.