De-Parenthesizing a String Given a properly-parenthesized string as input, output a list of all nonempty substrings within matching parentheses (or outside of all parentheses), with nested parentheses removed. Each substring should be the sequence of characters in exactly the same matching parentheses. Substrings should be listed in order of depth, and substrings of the same depth should be listed in the order they occur in the string. Assume the input is always correctly parenthesized. 

You may assume that the input contains only lower-case ASCII letters and parentheses.

Your answer should be a function that, when given a string, returns a list of strings.

Examples:

                   'a(b)c(d)e' -&gt; ['ace', 'b', 'd']
                   'a(b(c)d)e' -&gt; ['ae', 'bd', 'c']
                  'a((((b))))' -&gt; ['a', 'b']
                        'a()b' -&gt; ['ab']
                            '' -&gt; []
                           'a' -&gt; ['a']
          '(((a(b)c(d)e)f)g)h' -&gt; ['h', 'g', 'f', 'ace', 'b', 'd']
'ab(c(((d)ef()g)h()(i)j)kl)()' -&gt; ['ab', 'ckl', 'hj', 'efg', 'i', 'd']


Fewest bytes wins.
JavaScript ES6, 91 93 104 133 148

Edit2 2 bytes saved thx user81655

Edit Using more strings and less arrays 

Test running the snippet below in an EcmaScript 6 compliant browser



f=s=&gt;[...s].map(c=&gt;l+=c&lt;')'||-(o[l]=(o[l]||'')+c,c&lt;'a'),o=[],l=0)&amp;&amp;(o+'').match(/\w+/g)||[]

// Less golfed

u=s=&gt;{
  o=[]; l=0;
  [...s].map(c=&gt;{
    if (c&gt;'(') // letters or close bracket
      o[l]=(o[l]||'')+c, // add letter or close bracket to current level string
      l-=c&lt;'a' // if close bracket, decrement level
    else
      ++l // open bracket, increment level
  })
  o = o+'' // collapse array to comma separated string
  return o.match(/\w+/g)||[] // fetch non empty strings into an array
}

// TEST
console.log=x=&gt;O.innerHTML+=x+'\n'

;[ 'a(b)c(d)e'                    // ['ace', 'b', 'd']
 , 'a(b(c)d)e'                    // ['ae', 'bd', 'c']
 , 'a((((b))))'                   // ['a', 'b']
 , 'a()b'                         // ['ab']
 , ''                             // []
 , 'a'                            // ['a']
 , '(((a(b)c(d)e)f)g)h'           // ['h', 'g', 'f', 'ace', 'b', 'd']
 , 'ab(c(((d)ef()g)h()(i)j)kl)()' // ['ab', 'ckl', 'hj', 'efg', 'i', 'd']
].forEach(t=&gt;console.log(t +" -&gt; " + f(t)))
&lt;pre id=O&gt;&lt;/pre&gt;