Initial version for code review

Because the initial development was occurring on master, there isn't an easy way to do code review. This pull exists solely as a means to code review the entire project. Any changes will be put straight into master and this pull will be closed and the `initial-code-review` branch deleted. All future development will use pull requests into master to facilitate code review.
Yeah, you're right. I was trying to minimize the number of methods a new `Backend` needs to implement so it's as easy as possible to make new ones. This function in particular was probably copied from `Backend` and modified to record stats.

I made `decrement` abstract to force all `Backends` to implement it: 4f28f484d24c664a190a43b8a747a556639bf393.