BigIp constructor

@class
@classdesc
Provides core functionality (CRUD operations, ready, etc) and maintains
references to other modules in f5-cloud-libs.

After createing a BigIp with this constructor, you must call the
async init() method.

@param {Object} [options]               - Optional parameters.
@param {Object} [options.logger]        - Logger to use. Or, pass loggerOptions to
get your own logger.
@param {Object} [options.loggerOptions] - Options for the logger.
See {@link module:logger.getLogger} for details.
function BigIp(options) {
    const logger = options ? options.logger : undefined;
    let loggerOptions = options ? options.loggerOptions : undefined;
    let dependentOptions = {};

    if (logger) {
        this.logger = logger;
        util.setLogger(logger);
        cryptoUtil.setLogger(logger);
        localKeyUtil.setLogger(logger);
        authn.setLogger(logger);
        dependentOptions = { logger: this.logger };
    } else {
        loggerOptions = loggerOptions || { logLevel: 'none' };
        loggerOptions.module = module;
        this.logger = Logger.getLogger(loggerOptions);
        util.setLoggerOptions(loggerOptions);
        cryptoUtil.setLoggerOptions(loggerOptions);
        localKeyUtil.setLoggerOptions(loggerOptions);
        authn.setLoggerOptions(loggerOptions);
        dependentOptions = { loggerOptions };
    }

    // We're not ready until we have all the info we need (password from URL, for example)
    // Must call init() to set this
    this.isInitialized = false;

    this.cluster = new BigIpCluster(this, dependentOptions);
    this.gtm = new BigIpGtm(this, dependentOptions);
    this.onboard = new BigIpOnboard(this, dependentOptions);
}