gateInSlot(col, row) {
        if (col < 0 || col >= this.columns.length || row < 0 || row >= this.numWires) {
            return undefined;
        }
        let gate = this.columns[col].gates[row];
        return gate === undefined ? undefined : gate;
    }
A gate is only "in" the slot at its top left.
It "covers" any other slots underneath it.
@param {!int} col
@param {!int} row
@returns {undefined|!Gate}