Add IOWebSocketChannel.innerWebSocket

Supersedes #141 - expose the entire `dart:io` web socket instead of
selectively forwarding more parts of the interface.

This does not cover the case of changing a setting immediately after the
socket is connected. As a followup we may want to add a
`Future<WebSocketChannel> get onConnected` to have a signal on
connection and enable immediately setting options.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e099326..da9bb62 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 2.1.0-dev
+
+- Add `IOWebSocketChannel.innerWebSocket` getter to access features not exposed
+  through the shared `WebSocketChannel` interface.
+
 ## 2.0.0
 
 - Support null safety.
diff --git a/lib/io.dart b/lib/io.dart
index f90e103..8453ca8 100644
--- a/lib/io.dart
+++ b/lib/io.dart
@@ -35,7 +35,11 @@
   @override
   final WebSocketSink sink;
 
-  // TODO(nweiz): Add a compression parameter after the initial release.
+  /// The underlying [WebSocket], if this channel has connected.
+  ///
+  /// `If the future returned from [WebSocket.connect] has not yet completed, or
+  /// completed as an error, this will be null.
+  WebSocket? get innerWebSocket => _webSocket;
 
   /// Creates a new WebSocket connection.
   ///
diff --git a/pubspec.yaml b/pubspec.yaml
index 9454c65..5e40dcc 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: web_socket_channel
-version: 2.0.0
+version: 2.1.0-dev
 
 description: >-
   StreamChannel wrappers for WebSockets. Provides a cross-platform
@@ -8,7 +8,7 @@
 repository: https://github.com/dart-lang/web_socket_channel
 
 environment:
-  sdk: ">=2.12.0-0 <3.0.0"
+  sdk: ">=2.12.0 <3.0.0"
 
 dependencies:
   async: ^2.5.0