I prefer to offload this kind of things completely to the CSS: I'd remove this whole getter/setter/private variable set, just keep the `@published visible`, and add this CSS rule:
    :host([visible=true]:host) {
        visibility: visible;
    }

    :host([visible=false]:host) {
        visibility: hidden;
    }