Modeling Double-Entry Accounting in Go: Types That Make Invariants Impossible to Violate