To make it easier to try changes, I ended up adding some of the general-purpose functionality in various pull requests to D2D (linked from the commits). This pull request brings them over. The commits are fairly independent, so might make sense to look at them individually. Only grouped them together in a single pull request because I knew there would be a lot of merge conflicts otherwise.
Closes #34. Closes #41.
To make it easier to try changes, I ended up adding some of the general-purpose functionality in various pull requests to D2D (linked from the commits). This pull request brings them over. The commits are fairly independent, so might make sense to look at them individually. Only grouped them together in a single pull request because I knew there would be a lot of merge conflicts otherwise.
Follow-up TODOs