References given `value` as {@link #Thing|Thing} of given `type`.
@param {string} type Thing {@link #Thing#type|type}.
@param {*} value Thing {@link #Thing#value|value}.
@returns {Thing}
@throws {TypeError}
@see {@link #is|is}, {@link #no|no}, {@link #Thing|Thing}
@thing
function thing(type, value) {
	if (arguments.length < 2) {
		if (instance(type, Thing)) {
			return type;
		}

		value = type;
		type = typeof value === 'string' || typeof value === 'number' || instance(value, RegExp) ?
			'text' :
			'unknown';
	}

	return instance(value, Promise) ?
		value.then(
			thing.bind(null, type)
		) :
		new Thing(type, value);
}