Just noticed that running `./scripts/release/build.js -v 16.1.1` gives me:

```
 ERROR  ENOTDIR: not a directory, open '/Users/gaearon/p/react/packages/.DS_Store/package.json'

Error: 
    at Object.fs.openSync (fs.js:653:18)
    at fs.readFileSync (fs.js:554:33)
    at readdirSync.filter.dir (/Users/gaearon/p/react/scripts/release/utils.js:31:36)
    at Array.filter (<anonymous>)
    at getPublicPackages (/Users/gaearon/p/react/scripts/release/utils.js:29:36)
```

We should ignore system directories there.
const {stdout} = await exec(command, options);
  return stdout.trim();
};
const unexecutedCommands = [];
const execUnlessDry = async (command, {cwd, dry}) => {
  if (dry) {
    unexecutedCommands.push(`${command} # {cwd: ${cwd}}`);
  } else {
    await exec(command, {cwd});
  }
};
const getPublicPackages = () => {
  const packagesRoot = join(__dirname, '..', '..', 'packages');
  return readdirSync(packagesRoot).filter(dir => {
    const packagePath = join(packagesRoot, dir, 'package.json');
    const packageJSON = JSON.parse(readFileSync(packagePath));
    return packageJSON.private !== true;
  });
};
const getUnexecutedCommands = () => {
  if (unexecutedCommands.length > 0) {
    return chalk`
      The following commands were not executed because of the {bold --dry} flag:
      {gray ${unexecutedCommands.join('\n')}}
    `;
  } else {
    return '';
  }
};
const logPromise = async (promise, text, isLongRunningTask = false) => {