Implement recursive indirect block creation for DAGs

Also cleaned up a bunch of code related to building and reading DAGs
not in this PR, but looking at the code in this file https://github.com/jbenet/go-ipfs/blob/feat/indirect/importer/importer.go I think there is a TOCTTOU bug: 

```Go
	stat, err := os.Stat(fpath)
	if err != nil {
		return nil, err
	}

	if stat.IsDir() {
		return nil, fmt.Errorf("`%s` is a directory", fpath)
	}

        // file could have changed to a Dir under our feet by this point.
	f, err := os.Open(fpath)
	if err != nil {
		return nil, err
	}
	defer f.Close()
```

I think we want to `Open` the file and then stat it:

```Go
f, err := os.Open(fpath)
if err != nil {
  return nil, err
}
defer f.Close()

{
  stat, err := f.Stat()
  if err != nil {
    return nil, err
  }
  if stat.IsDir() {
    return nil, fmt.Errorf("`%s` is a directory", fpath)
  }
}
// i'm experimenting with using blocks to isolate vars. They look
// weird, but prevent from data racing accidentally when parallelizing
// code in closures. this **just** happened to me :c
```