Run CI on windows and linux

Also analyzer with strict checks
Also test on oldest supported SDK
skip symlink file tests on Windows
diff --git a/.travis.yml b/.travis.yml
index 7dee3cc..5ef53eb 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,15 +1,22 @@
 language: dart
 
+os:
+- linux
+- windows
+
 dart:
+  - 2.3.0
   - dev
+
 dart_task:
   - test
-  - dartanalyzer
+  - dartanalyzer: --fatal-infos --fatal-warnings .
 
 matrix:
   include:
-    - dart: dev
-      dart_task: dartfmt
+  # Only validate formatting using the dev release
+  - dart: dev
+    dart_task: dartfmt
 
 # Only building master means that we don't run two builds for each pull request.
 branches:
diff --git a/test/symbolic_link_test.dart b/test/symbolic_link_test.dart
index 795303c..80ba32c 100644
--- a/test/symbolic_link_test.dart
+++ b/test/symbolic_link_test.dart
@@ -11,6 +11,10 @@
 
 import 'test_util.dart';
 
+const _skipSymlinksOnWindows = {
+  'windows': Skip('Skip tests for sym-linked files on Windows'),
+};
+
 void main() {
   setUp(() async {
     await d.dir('originals', [
@@ -43,14 +47,18 @@
     });
 
     group('links under root dir', () {
-      test('access sym linked file in real dir', () async {
-        final handler = createStaticHandler(d.sandbox);
+      test(
+        'access sym linked file in real dir',
+        () async {
+          final handler = createStaticHandler(d.sandbox);
 
-        final response = await makeRequest(handler, '/link_index.html');
-        expect(response.statusCode, HttpStatus.ok);
-        expect(response.contentLength, 13);
-        expect(response.readAsString(), completion('<html></html>'));
-      });
+          final response = await makeRequest(handler, '/link_index.html');
+          expect(response.statusCode, HttpStatus.ok);
+          expect(response.contentLength, 13);
+          expect(response.readAsString(), completion('<html></html>'));
+        },
+        onPlatform: _skipSymlinksOnWindows,
+      );
 
       test('access file in sym linked dir', () async {
         final handler = createStaticHandler(d.sandbox);
@@ -91,15 +99,19 @@
     });
 
     group('links under root dir', () {
-      test('access sym linked file in real dir', () async {
-        final handler =
-            createStaticHandler(d.sandbox, serveFilesOutsidePath: true);
+      test(
+        'access sym linked file in real dir',
+        () async {
+          final handler =
+              createStaticHandler(d.sandbox, serveFilesOutsidePath: true);
 
-        final response = await makeRequest(handler, '/link_index.html');
-        expect(response.statusCode, HttpStatus.ok);
-        expect(response.contentLength, 13);
-        expect(response.readAsString(), completion('<html></html>'));
-      });
+          final response = await makeRequest(handler, '/link_index.html');
+          expect(response.statusCode, HttpStatus.ok);
+          expect(response.contentLength, 13);
+          expect(response.readAsString(), completion('<html></html>'));
+        },
+        onPlatform: _skipSymlinksOnWindows,
+      );
 
       test('access file in sym linked dir', () async {
         final handler =
@@ -113,15 +125,19 @@
     });
 
     group('links not under root dir', () {
-      test('access sym linked file in real dir', () async {
-        final handler = createStaticHandler(p.join(d.sandbox, 'alt_root'),
-            serveFilesOutsidePath: true);
+      test(
+        'access sym linked file in real dir',
+        () async {
+          final handler = createStaticHandler(p.join(d.sandbox, 'alt_root'),
+              serveFilesOutsidePath: true);
 
-        final response = await makeRequest(handler, '/link_index.html');
-        expect(response.statusCode, HttpStatus.ok);
-        expect(response.contentLength, 13);
-        expect(response.readAsString(), completion('<html></html>'));
-      });
+          final response = await makeRequest(handler, '/link_index.html');
+          expect(response.statusCode, HttpStatus.ok);
+          expect(response.contentLength, 13);
+          expect(response.readAsString(), completion('<html></html>'));
+        },
+        onPlatform: _skipSymlinksOnWindows,
+      );
 
       test('access file in sym linked dir', () async {
         final handler = createStaticHandler(p.join(d.sandbox, 'alt_root'),