tryGrab(hand, duplicate=false, wholeColumn=false, ignoreResizeTabs=false, alt=false) {
        if (wholeColumn) {
            let grabRowResult = this._tryGrabRow(hand, alt);
            if (grabRowResult !== undefined) {
                return grabRowResult;
            }
            return this._tryGrabWholeColumn(hand, duplicate, alt) || {newCircuit: this, newHand: hand};
        }

        let newHand = hand;
        let newCircuit = this;
        if (!ignoreResizeTabs) {
            let resizing = this._tryGrabResizeTab(hand);
            if (resizing !== undefined) {
                newHand = resizing.newHand;
                newCircuit = resizing.newCircuit;
            }
        }

        return newCircuit._tryGrabGate(newHand, duplicate, alt) || {newCircuit, newHand};
    }
@param {!Hand} hand
@param {!boolean=false} duplicate
@param {!boolean=false} wholeColumn
@param {!boolean=false} ignoreResizeTabs
@param {!boolean=false} alt Whether or not to replace grabbed gates with their alternates.
@returns {!{newCircuit: !DisplayedCircuit, newHand: !Hand}}