reimplement entity components

don't require caller to know component name to use its attributes --
requires globally unique attribute names but that's not a huge deal